1

我的代码:

#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 AND elt 14 匹配 elt 14+12 我想打印它。ETC...

我的列表中肯定有部分符合这个标准,但程序没有返回任何输出。

4

2 回答 2

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

这可能就是你想要的。

于 2013-05-15T11:29:38.437 回答
2

要在“锁步”中迭代多个列表(技术上是可迭代的),您可以使用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.

于 2013-05-15T12:17:33.963 回答