我的代码:
#prints out samenodes
f = open('newerfile.txt')
mylist = list(f)
count = 0
i = 1
while count < 1000:
if mylist[i] == mylist[i+12] and mylist [i+3] == mylist [i+14]:
print mylist[i]
count = count+1
i = i+12
我的意图是看待elt 1,elt2。如果elt 1 == elt 13 AND elt 2 == elt 14我要打印elt1。然后,我要看待elt 13和elt14。如果elt 2匹配elt 13 + 12 AND elt 14匹配elt 14 + 12我要打印。等等...
当然,我列表中的某些部分符合此条件,但是该程序未返回任何输出。
最佳答案
要在“锁步”中遍历多个列表(从技术上讲是可迭代),可以使用zip
。在这种情况下,您要迭代mylist
的四个版本,分别偏移0、12、2和13。
zippedLists = zip(mylist, mylist[12:], mylist[2:], mylist[13:])
接下来,您需要第0、12、24等个元素。这是通过slice完成的:
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
的用例。关于python - 循环以匹配列表的一部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16563704/