我的代码:

#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/

10-12 16:46