2013-05-08 59 views
2

我有兩個列表,我稱其爲old_rowsnew_rows在列表的兩個列表中查找已更改或新行

每一行都是一個包含30個項目的列表。每個列表中可能有非常大的(和未知的)數量的行。這兩個列表可能包含不同數量的行。

[ [row1_item1, row1_item2... row1_item30], 
    [row2_item1, row2_item2... row2_item30], 
    .... 
    [rowN_item1, rowN_item2... rowN_item30] ] 

其中N很大且可變。

我希望做的是比較old_rowsnew_rows,創造的「顯著差異」名單 - 我只對行之間比較約10個項目有興趣。我已經有一個函數比較兩行只有這些項目。

所以,我想這一點:

changes = [] 
    for o, n in izip_longest(old_rows, new_rows): 
     if not o: 
     changes.append(output_row(None, n)) 
     continue 
     if not n: 
     continue 
     if significant_differences(o, n): 
     changes.append(output_row(o, n)) 

煩人,這需要在Python 2.4工作,所以izip_longest出來了。此外,code for izip_longest不起作用,因爲不明原因的接下來的不是2.4友好的。

理想情況下尋找pythonic和快速使用發電機來應付潛在的非常大的名單。

+1

'元組(圖(下,迭代器))'可以改爲'元組(i.next(),用於我在迭代器中)'對於Py <= 2.6是否解決了你的問題?或者'從運算符導入methodcaller''元組(地圖(methodcaller('next'),iterators))'可能會快一點 – jamylak 2013-05-08 11:26:44

+0

感謝您的第一行解決了這個問題。 methodcaller顯然是在2.6中引入的。 – 2013-05-08 12:07:11

+0

噢好吧,我會將其作爲答案提交,如果它能夠工作,您可以接受。 – jamylak 2013-05-08 12:09:29

回答

0
tuple(map(next, iterators)) 

可改爲

tuple(i.next() for i in iterators) 

爲PY < = 2.6

相關問題