我有一個列表[ [0], [0,1], [1,2], [3] ]
,我試圖將類似的元素組合在一起。我需要輸出爲[ [0,1,2], [3] ]
。這是將列表中的類似元素分組。有沒有一個首選的方法來做到這一點?在列表中列出類似的元素
回答
你也可以遍歷每個輸入列表中的項目,構建羣體(如需要):
def calculate_groups(data):
if not data:
return []
groups = [set(data[0])]
for item in data[1:]:
item_set = set(item)
for group in groups:
if any(k in group for k in item):
group.update(item_set)
break
else:
groups.append(item_set)
return [list(group) for group in groups]
這使用sets,any
和list comprehension末。
例子:
>>> calculate_groups([ [0], [0,1], [1,2] ,[3] ])
[[0, 1, 2], [3]]
你應該在函數組group'中重命名變量'group' ... – Jasper
@Jasper:這是一個很好的觀點。爲了清楚起見,我已將函數重命名爲'calculate_groups'。 –
我建議你使用的集列表,讓我們把它results_list,從一個空表開始,然後往裏面同時遍歷列表您的輸入列表:對於輸入列表的子列表中的每個項目,您都必須檢查它們是否屬於results_list中的任何集合。如果它們都不屬於,則只需添加一個包含該子列表元素的新集合。如果他們這樣做,則必須修改results_list合併至少存在一個項目的所有集合,包括在該集合中設置子列表的所有項目。
def regroup(groups_list):
results_list = [set(groups_list[0])]
for sub_list in groups_list[1:]:
current_items_set = set(sub_list)
groups_to_merge = []
for group in results_list:
if any(k in group for k in sub_list):
groups_to_merge.append(group)
if not groups_to_merge:
# All of the items are new
results_list.append(current_items_set)
elif len(groups_to_merge) == 1:
# Current items belong only to one of the existing groups
groups_to_merge[0] = groups_to_merge[0].update(current_items_set)
else:
# The items belong to more than one group, merging is needed
new_set = reduce(lambda x, y: x.union(y), groups_to_merge) or set()
new_set.update(current_items_set)
# The new results_list will have the new merged set, excluding the separated ones
results_list = filter(lambda x: x not in groups_to_merge, results_list) + [new_set]
return [sorted(x) for x in results_list]
例子:
input_list_1 = [[0], [0,1], [1,2], [3]]
regroup(input_list_1)
[[0, 1, 2], [3]]
input_list_2 = [[0], [0,1], [1,2], [3], [0, 3]]
regroup(input_list_2)
[[0, 1, 2, 3]]
這裏還有一個。比其他解決方案短一點。
def get_cliques(groups):
cliques = {}
for g in groups:
g = {*g}.union(*(cliques.get(i, []) for i in g))
cliques.update({i: g for i in g})
return {id(c): c for c in cliques.values()}.values()
這段代碼背後的想法很簡單:一個派系的元素總是會共享clique
集合對象。一個集合將包含所有已知在相應集團中的元素。所以最後我們只需要從cliques
字典中獲得唯一的集合對象。我們使用內置的id
函數返回對象內存地址(在CPython中):cliques
字典中的同一個集合中的不同元素包含相同的集合對象,因此我們可以將cliques
字典壓縮爲較小的值,這些值將是唯一的。
- 1. 列表中的類似元素
- 2. 在列表中排列元素,以便類似的元素相距最遠
- 3. 轉換列表中列出的元素
- 4. 按元素列表列出的元素列表python
- 5. 刪除python中的列表中的類似元素
- 6. 在類列表中查找類元素
- 7. 找到列表中最大數量的類似元素
- 8. 列出出現在兩個列表中的元素?
- 9. 包含列表元素的列表的列表中的元素列表
- 10. 獲取元素的類型從列表<T>在C#中導出列表
- 11. 2列出,如果列表1的元素X具有Y類,添加類X元素列表第二
- 12. 列表中的日曆類型元素
- 13. 排列列表元素水平溢出
- 14. 組合包含類似子字符串的列表元素
- 15. Linq到XML,從類似的名字元素檢索列表
- 16. Swift相似元素陣列
- 17. 按相似元素的元素排序列表
- 18. 將列表中的元素收集到相同元素列表的列表中?
- 19. 元素不在列表中
- 20. 如何在python列表中列出元素的總和?
- 21. 陣列中的元素列表出現在一個新行上
- 22. 輸出列表中的列表的元素名稱
- 23. 更新列表中的元素列表?
- 24. 訪問列表列表中的元素
- 25. 搜索列表中的元素列表
- 26. 列表中的球拍列表元素
- 27. R中自定義類的元素列表的排序列表?
- 28. 獲取列表中列出的元素的長度中的R
- 29. 返回兩個列表中出現的元素列表--SML
- 30. 對齊列表元素中的元素
你已經抽象了你的問題,所以沒有明確的答案。你能舉一個你的問題域是什麼樣的例子嗎? –
每個數字代表一個名字。 0是鮑勃,1是湯姆,2是弗雷德,3是羅伯特。除羅伯特之外,這些都是聯繫在一起的。 –
在這種情況下,我會說他們最初分組的事實是無關緊要的,所以刪除所有組(使用'append'減少'')。然後確保它們是唯一的(或使用一組開頭)然後進行排序和分組。我也會親自使用減少。 –