我的代码:
#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,elt 2.如果elt 1 == elt 13 AND elt 2 == elt 14我想打印elt 1.然后,我想看看elt 13和elt 14。 elt 2匹配elt 13 + 12和elt 14匹配elt 14 + 12我想打印它。 ETC ...
我的列表中肯定有部分符合此条件,但程序不返回任何输出。
答案 0 :(得分:3)
一个问题是你的指数。请注意,列表以索引0开头。
我很惊讶没有人回答这个问题:
#prints out samenodes
f = open('newerfile.txt')
mylist = list(f)
count = 0
i = 0
while count < 1000:
#print mylist[i]
#print mylist[i+12]
#print mylist[i+13]
#print mylist[i+14]
#...use prints to help you debug
if mylist[i] == mylist[i+12] and mylist [i+1] == mylist [i+13]:
print mylist[i]
count = count+1
i = i+12
这可能是你想要的。
答案 1 :(得分:2)
要在“锁步”中迭代多个列表(技术上,可迭代),您可以使用zip
。在这种情况下,您希望迭代四个版本的mylist
,偏移0,12,2和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
中的等效函数,可能会获得更好的内存性能,itertools.tee
使用惰性迭代器来防止不必要地复制列表:
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
,但我不确定我记得它是什么 - 我认为这是{{3}的用例}。