簡體   English   中英

在Python中將數字列表分組在一起

[英]Grouping lists of numbers together in Python

我有以下內容,這是Python中列表的列表,並且是我擁有的部分值列表:

[1,33]
[2,10,42]
[5,1,33,44]
[10,42,98]
[44,12,100,124]

有沒有一種將它們分組的方法,以便它們收集每個列表中共有的值?

例如,如果我查看第一個列表[1,33],則可以看到該值存在於第三個列表中:[5,1,33,44]

因此,這些被分組為

[5,1,33,44]

如果繼續看下去,我可以看到最終列表中有44個,因此它將與該列表一起分組。

將[44,12,100,124]添加到[5,1,33,44]

給出:[1,5,12,33,44,100,124]

第二個列表[2,10,42]與[10,42,98]具有共同的值,因此將它們連接在一起可得出:[2,10,42,98]

因此,最終列表為:

[1,5,12,33,44,100,124]

[2,10,42,98]

我猜這種類型的分組有一個特定的名稱。 是否有可以自動處理的庫? 還是我必須編寫手動搜索方式?

我希望所做的編輯可以使我更清楚地了解要實現的目標。

謝謝。

這是一個不需要標准庫或3rd party軟件包的解決方案。 請注意,這會改變a 為避免這種情況,只需復制a並對其進行處理。 結果是一個列表列表,其中包含您得到的排序列表。

a = [
     [1,33],
     [2,10,42],
     [5,1,33,44],
     [10,42,98],
     [44,12,100,124]
    ]

res = []
while a:
    el = a.pop(0)
    res.append(el)
    for sublist in a:
        if set(el).intersection(set(sublist)):
            res[-1].extend(sublist)
            a.remove(sublist)
res = [sorted(set(i)) for i in res]
print(res)
# [[1, 5, 12, 33, 44, 100, 124], [2, 10, 42, 98]]

工作原理:

  • 形成一個空的結果列表res 從分組a將被“轉移”在這里。
  • .pop()關閉的第一個元素a 這將修改a就位並將el定義為該元素。
  • 然后遍歷每個子表a ,你的突然出現比較el那些子列表和“建立”公共集。 這是您的問題有點棘手的地方,因為您需要逐漸增加相交的集合,而不是一次找到多個子列表的交集。
  • 重復此過程,直到a為空。

另外,如果您只想將偶數和奇數子列表組合在一起(您的問題仍然不清楚),則可以使用itertools:

from itertools import chain
grp1 = sorted(set(chain.from_iterable(a[::2])))
grp2 = sorted(set(chain.from_iterable(a[1::2])))
print(grp1)
print(grp2)
# [1, 5, 12, 33, 44, 100, 124]
# [2, 10, 42, 98]

暫無
暫無

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

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