要在“锁步”中迭代多个列表(技术上是可迭代的),您可以使用zip
. 在这种情况下,您想要迭代 0、12、2mylist
和 13 的四个版本。
zippedLists = zip(mylist, mylist[12:], mylist[2:], mylist[13:])
接下来,您需要第 0、第 12、第 24 等元素。这是通过切片完成的:
slicedList = zippedLists[::12]
然后你可以迭代它:
for elt1, elt13, elt2, elt14 in slicedList:
if elt1 == elt13 and elt2 == elt14:
print elt1
将它与文件操作放在一起,我们得到
#prints out samenodes
f = open('newerfile.txt')
mylist = list(f)
zippedLists = zip(mylist, mylist[12:], mylist[2:], mylist[13:])
slicedList = zippedLists[::12]
for elt1, elt13, elt2, elt14 in slicedList:
if elt1 == elt13 and elt2 == elt14:
print elt1
像这样的代码通常被认为比当前版本更“pythonic”,因为在迭代列表时通常不鼓励使用列表索引。
请注意,如果您的列表中有大量元素,则上述代码会创建(并在某些时候销毁)五个额外的列表。因此,如果您使用 中的等效函数,您可能会获得更好的内存性能itertools
,它使用惰性迭代器来防止不必要地复制列表:
from itertools import islice, izip
#prints out samenodes
f = open('newerfile.txt')
mylist = list(f)
zippedLists = itertools.izip(mylist, islice(mylist, 12), islice(mylist, 2), islice(mylist, 13))
slicedList = itertools.islice(zippedLists, 0, None, 12)
for elt1, elt13, elt2, elt14 in slicedList:
if elt1 == elt13 and elt2 == elt14:
print elt1
可能有一种方法itertools
可以避免将整个文件mylist
放入itertools.tee
.