2013-05-15 103 views
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和ELT 2 == ELT 14我要打印ELT 1.然後,我想看看elt 13和elt 14.如果elt 2匹配elt 13 + 12並且elt 14匹配elt 14 + 12我想打印它。 ETC ...

我的列表當然有些部分符合這個標準,但是程序沒有返回任何輸出。

+0

'elt'應該是整行嗎? –

回答

2

要在「鎖步」中遍歷多個列表(技術上,iterables),可以使用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,其中使用惰性迭代器,以防止複製使用等效的功能,你可能會得到更好的內存性能列出不必要的:

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

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 

這可能是你想要的。