2017-03-01 68 views
-4

我不明白索引如何通过Python中的循环。Python索引解释

在这个相当简单的代码中,为什么del l[i+1]给出了一个超出绑定错误的索引?是不是由while循环负责检查?你如何检查,看看你是否在循环结束?

def getString(str): 
    l = list(str) 
    i=0 
    while i < len(l)-1 and i != len(l)-1: 
     if l[i] == l[i+1]: 
      del l[i] 
      del l[i+1] 
      i=0 
      if len(l) == 0: 
       print("Empty String") 
       break 
     else: 
      i+=1 
    print(l) 

str = "aabbcc" 
getString(str) 
+1

您可以使用更多“打印”或“ http://pythontutor.com/。请注意,与C++和Java一样,在循环体中'while'条件不会被重新评估*,所以您不清楚为什么期望不同的行为。 – jonrsharpe

回答

1

当您删除l[i]时,会将列表缩小一个。如果你只有没有del l[i+1]你会没事的,或者如果你以相反的顺序删除,你会没事的,但首先删除前面的元素意味着你有效地删除元素i+2(基于开始时的原始列表该循环执行)。

只需翻转假摔到:

 del l[i+1] 
     del l[i] 

或略微更有效地删除这两个元素在一次:

 del l[i:i+2] 

将解决这个问题。

如图所示,考虑[1, 2](我们假设您的if check检查通过,我使用了不同的值以使其更容易理解)。当i0,你del l[0],离开l[2],那么你del l[1]现在已经超过列表的末尾。如果你第一次使用del l[1],你有[1],而del l[0]工作得很好。

0

@ShadowRanger's answer是正确的。您可以在命令行中使用python查看区别:

$ python 
Python 2.7.13 (default, Dec 27 2016, 14:14:52) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> l = [1,2,3,4] 
>>> i=1 
>>> del l[i] 
>>> del l[i+1] 
>>> l 
[1, 3] # note that we went one further because the list shrank 
>>> l=[1,2,3,4] 
>>> del l[i+1] 
>>> del l[i] 
>>> l 
[1, 4] # deleted adjacent items as expected 
>>>