gpt4 book ai didi

python - 如何检测公共(public)元素列表和至少包含 1 个公共(public)元素的组列表?

转载 作者:太空狗 更新时间:2023-10-30 00:00:51 24 4
gpt4 key购买 nike

我有一个包含 1 列(+ 索引)的数据框,其中包含子列表或元素的列表。我想检测列表/子列表中的公共(public)元素,并将列表与至少 1 个公共(public)元素分组,以便只有没有任何公共(public)元素的元素列表。列表/子列表目前是这样的(例如 4 行):

                 Num_ID
Row1 [['A1','A2','A3'],['A1','B1','B2','C3','D1']]`

Row2 ['A1','E2','E3']

Row3 [['B4','B5','G4'],['B6','B4']]

Row4 ['B4','C9']

n 个没有公共(public)元素的列表(前 2 个的示例):

['A1','A2','A3','B1','B2','C3','D1','E2','E3']
['B4','B5','B6','C9','G4']

最佳答案

您可以使用 NetworkXconnected_components为此的方法。以下是我将如何处理此改编 this解决方案:

import networkx as nx
from itertools import combinations, chain

df= pd.DataFrame({'Num_ID':[[['A1','A2','A3'],['A1','B1','B2','C3','D1']],
['A1','E2','E3'],
[['B4','B5','G4'],['B6','B4']],
['B4','C9']]})

首先展平每个列表中的子列表:

L = [[*chain.from_iterable(i)] if isinstance(i[0], list) else i 
for i in df.Num_ID.values.tolist()]

[['A1', 'A2', 'A3', 'A1', 'B1', 'B2', 'C3', 'D1'],
['A1', 'E2', 'E3'],
['B4', 'B5', 'G4', 'B6', 'B4'],
['B4', 'C9']]

鉴于列表/子列表有超过 2 个元素,您可以从每个子列表中获取所有长度为 2 的组合并将它们用作网络边缘(注意边缘只能连接两个节点):

L2_nested = [list(combinations(l,2)) for l in L]
L2 = list(chain.from_iterable(L2_nested))

生成一个图,并使用 add_edges_from 添加您的列表作为图的边。然后使用 connected_components,它将精确地为您提供图中连接组件集的列表:

G=nx.Graph()
G.add_edges_from(L2)
list(nx.connected_components(G))

[{'A1', 'A2', 'A3', 'B1', 'B2', 'C3', 'D1', 'E2', 'E3'},
{'B4', 'B5', 'B6', 'C9', 'G4'}]

关于python - 如何检测公共(public)元素列表和至少包含 1 个公共(public)元素的组列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56684480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com