循环以匹配列表的部分

时间:2013-05-15 11:21:39

标签: python

我的代码:

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

我的列表中肯定有部分符合此条件,但程序不返回任何输出。

2 个答案:

答案 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}的用例}。