2014-02-07 56 views
0

我是Python新手。我有以下代碼,這是我目前正在開發的字符串算法的一部分。Python:更易讀的列表理解

>>> newlist=[] 
>>> i =0 

>>> for x in range(len(list1)): 
     new_item = [y for y in list1[i] if y not in list2[i]] 
     newlist.append(new_item) 
     i=i+1 

>>> print newlist 

我喜歡這樣做,使用列表理解,因爲我讀過它是性能優化。有人可以給我一種方法嗎?

謝謝。

[編輯]

例如:

list1= [[['pat'],['cut'],['rat']], [['sat','pat'],['cut','pat']],[['instructor','plb','error0992'],['instruction','address','00x0993'],['data','address','017x112']] 

list2= [[['pat'], ['cut'], ['rat']], [['sat', 'pat']], [['instructor', 'plb', 'error0992'], ['instruction', 'address', '00x0993']]] 

因此,新的名單,

newlist= [[], [['cut', 'pat']], [['data', 'address', '017x112']]] 
+0

可以給我們之前和例子你從輸入和輸出的期待是什麼之後?只是這樣我才能看到最終目標 – owen79

回答

3

如果你只是想是在一個列表中,而不是在其他所有元素,我會建議尋找到蟒蛇set秒。他們不允許重複,但性能和可讀性好處很大。

你會實現這個像這樣:如果你想在地方當前的解決方案,應用此

newlist = list(set(list1).difference(set(list2))) 

,你應該做沿着什麼多米尼克建議的東西線(略加編輯,以便閱讀):

[list(set(a)-set(b)) for a, b in zip(list1, list2)] 

如果訂單的問題,或者您有重複,那麼單列表理解你在上面了應該做的伎倆,只是把它包裝成一個lambda函數,以使其更易於閱讀:

single_item = lambda i: [y for y in list1[i] if y not in list2[i]] 
newlist = [single_item(i) for i in enumerate(list1)] 
+2

因爲'list1'和'list2'是列表的列表,你應該在'zip(list1,list2)]中爲'(a,b)''[list(set(a)-set(b))'做一些事情。 – sloth

+0

@DominicKexel你是完全正確的,現在編輯。 –

+0

我編輯了這個問題。這個實現看起來不錯。我會試試這個。 – Manoj

2

這是一個嵌套列表理解,做同樣的事情,你的代碼(雖然不會保留i的價值)。

newlist = [[y for y in list1[i] if y not in list2[i]] for i in range(len(list1))] 
+0

嵌套列表組合不是非常可讀... –

+0

我並不認爲海報特別希望解決方案具有極高的可讀性。對不起,如果這會導致誤解。 – icedtrees

+0

你應該閱讀問題的標題。 –

1

TL; DR:[[y for y in list1[i] if j not in list2[i]] for i in enumerate(list1)]

您應該使用enumerate代替range(len())非成語。您可能還想考慮將其作爲生成器表達式。無論是與具體的嵌套列表:

([y for y in list1[i] if j not in list2[i]] for i in enumerate(list1))

或不

((y for y in list1[i] if j not in list2[i]) for i in enumerate(list1))