簡體   English   中英

查找列表中的子集列表的索引

[英]Find the index of a list which is subset in a list of list

我有兩個非常大的列表列表(500 萬個)。

例如:

1) 第一個列表 a 始終包含 8 個元素的列表。

2) 第二個列表 b 始終包含 4 個元素的列表。

對於 b 中的每個列表,可能有多個子集,但這不是問題。

a=[[0 1 10 9 369 370 379 378],[1 2 11 10 370 371 380 379]..[[0 1 10 9 365 370 379 400]]

b=[[0 1 370 369],[1 2 371 370], ......]

我想知道 b 中的每個列表的 a 中包含其所有元素的列表的索引。

例如:我知道“b[0]=[0 1 370 369]”是“a[0]=[0 1 10 9 369 370 379 378]”的子集,因為 b[0] 中的所有元素都是包含在 a[0] 中。 b[1] 是 a[1] 的子集也是一樣。

所以我想要這樣的輸出:c=[[0],[1].......]。

如果有多個子集,我應該得到類似的結果:c=[[0],[1]....[20,19].....]

我的問題是我的代碼太慢了:

index=[]
for i in range(len(b)):
    for j in range(len(a)):
        if set(b[i])<set(a[j]):
        print b[i]
        print a[j]
        print j
        index.append([j]) #index in a 

這是我的代碼的輸出:

[  0   1 370 369]
[  0   1  10   9 369 370 379 378]
0

[  1   2 371 370]
[  1   2  11  10 370 371 380 379]
1

.
.
[369 370 739 738]
[369 370 379 378 738 739 748 747]
320
.
.

在循環結束時 len(index)=len(b) 因為我確信 b 中的每個列表總是 a 的子集。

每次迭代最多需要 30/40 秒。

我確定有一種更 Pythonic 的方式來執行相同的循環,我該如何加快速度?

謝謝

建立一個字典顯示哪些列表中的a包含每個號碼:

import collections
number_locations = collections.defaultdict(set)
for i, l in enumerate(a):
    for num in l:
        number_locations[num].add(i)

然后在每個列表b ,查找其中a它的元素可以被發現,並采取交集找到其中的元素a包含所有4個數字:

index = [set.intersection(*[number_locations[num] for num in l]) for l in b]

這會產生一個集合列表; 如果你真的需要列表,你可以在項目上調用list ,或者sorted以獲得排序的索引列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM