Python3.4用于循环迭代问题

时间:2014-08-29 19:29:23

标签: python for-loop python-3.x

我一直致力于一个项目,我遍历一个数据列表并删除某些字符前的所有文本。 (这是一个参考的例子)

>>> myList = ['foo<foo','bar<bar','baz<baz']
>>> for element in myList:
    for char in element:
        if (char == "<"):
            break
        else:
            charIndex = element.index(char)
            elementIndex = myList.index(element)
            print(charIndex, elementIndex)
            myList[elementIndex] = element[charIndex + 1 :]
0 0
Traceback (most recent call last):
  File "<pyshell#37>", line 7, in <module>
    elementIndex = myList.index(element)
ValueError: 'foo<foo' is not in list
>>> myList
['oo<foo', 'bar<bar', 'baz<baz']
>>> 

由于我不知道的原因,该元素在重新分配后未重命名 任何帮助都会很棒,提前谢谢!

1 个答案:

答案 0 :(得分:1)

您在设置myList[elementIndex]=

时删除了第一个字符
['oo<foo', 'bar<bar', 'baz<baz']

myList[elementIndex] = element[charIndex + 1:] # removes f

element[charIndex + 1:]  is from the `first index + 1` so it becomes `'oo<foo'`

如果您在循环中放置print(element[charIndex + 1 :]),则会看到'oo<foo',因此'foo<foo'将不再出现在您的myList中,您将获得ValueError

您已在element的第一次迭代中为'foo<foo'分配了for element in myList,因此您要与原始元素进行比较,而不是第二次循环中更新的列表元素。

您需要更新第二个循环中元素的值:

 myList[elementIndex] = element[charIndex + 1 :]
 element = element[charIndex + 1 :]

哪个输出:

['<foo', '<bar', '<baz']

您也可以使用列表comp在一行中执行此操作,如果“&lt;”也可以使用不在某些字符串中:

[s[s.index("<"):] if "<" in s else s for s in myList ]