2017-04-08 97 views
0

我在python中有19個大數字列表,並且希望從它們中創建一個新列表。所以最後我會有一個列表。 我作了如下的代碼兩個列表和完美的作品:在python中創建19個列表中的單個列表

a2 = [x for x in l2 if x+3 in l1] 

該代碼會在兩個列表中的元素只有當它們之間的區別是3,這意味着它發現的任何元素L1如果有元素L2比L1中該元素和新的名單將有L1

所提到的內容,例如,如果l1 = [1,2,3,6,5,7,8,9]l2 = [4, 6,10,11,13,14]

new = [1,3,7,8] 

但是我沒有更大的3個單位知道如何包含其餘的列表。因此,它不是尋找l2中的元素,而是尋找l 2 .... l19中的「比l1更大的3個單元」,並在l1(新列表)中返回3個小單元。 你知道如何做到這一點?

+0

如果這些名單載於主這將是更容易和Python的列表,而不僅僅是具有類似名稱的列表,如'l1',' l2',直到'l19'。你可以把它們當作'biglist [1]',...,'biglist [19]'? –

+0

以及我想到這一點,但是數據結構我是非常複雜的,如果我想這樣做,它使我的劇本效率要低得多。使用eval()的 – ARM

回答

0

如果我不要誤會你的意思,你可以試試這個,如果你哈瓦19名單,只是改變了range部分:

l1 = [4, 6,10,11,13,14] 
l2 = [1,2,3,6,5,7,8,9] 
l3=[3,7,10,11] 

print([x for i in range(2,4) for x in eval('l'+str(i)) if x+3 in l1]) 

輸出:

[1, 3, 7, 8, 3, 7, 10, 11] 
+0

很好的想法,但所提供的代碼沒有什麼什麼要求。如果你將x + 3更改爲x-3,也許會這樣? – Claudio

2

把所有的您的其他名單放入一個更大的名單,並結合成一組使用set.union

superlist = [l3, ..., l19] 
s = set(l2).union(*superlist) 
a2 = [x for x in l1 if x+3 in s] 

當然,您可以決定直接將列表傳遞給set.union

帶集合的成員查詢-O(1)複雜性 - 比列表O的速度要快 - O(n)。

+1

您可以使用空的()爲'.union()'把L2成'superlist = L2,...,L19]'讓這種方式更加清晰的代碼做什麼。 – Claudio

+0

也許我失去了一些東西,但同時與集的隸屬查找是O(1),*設定,你在循環的每一步都做其中建築*,爲O(n)。所以我不確定你會得到你希望的好處。 – DSM

+0

@DSM但如果只設置被構建一次(編輯),它會比多個列表查找 –

1
a2 = [x for x in l if x+3 in l1+l2+l3+l4+l5+...+l19] 

爲了完整起見,這裏還另有一個班輪由其他答案的啓發,你可以在超過19名名單的情況下使用的緣故:

a2=[x for x in l if x+3 in set().union(*[eval('l'+str(i+1)) for i in range(19)])] 

但是......

ATTENTION

這樣きnd單線看起來很不錯,但是致命如果真的很大的名單(他們可以不必要把你所有的CPU功率用於極其懶惰的時間),所以你會很樂意使用多線程而不是:

bigL = l1+l2+l3+l4+l5+...+l19 
setBigL = set(bigL) 
a2 = [x for x in l if x+3 in setBigL] 

爲了完整起見,在這裏如何讓bigL而不需要編寫所有列表中的名稱:

noOfLists = 19; strListAddition = '' 
for i in range(19): strListAddition+='l'+str(i+1)+'+' 
bigL = eval(strListAddition[0:-1]) 
相關問題