python - 按共享元素对列表进行分组
问题描述
假设我有以下子列表列表:
l = [['a', 'b'],
['a', 'c'],
['b', 'c'],
['c', 'd'],
['e', 'f'],
['f', 'g'],
['x', 'y']]
我的目标是将该列表重新排列为“存储桶”,以使存储桶中的每个子列表与存储桶中的至少一个其他子列表共享一个元素,并且不与不同存储桶中的任何子列表共享任何元素。用语言很难理解这一点,但在这种情况下,所需的结果将是:
result = [
[
['a', 'b'],
['a', 'c'],
['b', 'c'],
['c', 'd']
],
[
['e', 'f'],
['f', 'g']
],
[
['x', 'y']
],
]
这里的想法是['a','b']
进入 Bucket 1.与and['a','b']
共享元素,因此这些元素也进入 Bucket 1。现在还与当前在 Bucket 1 中的元素共享一个元素,因此它也被添加到 Bucket 1 中。之后,不再有与 Bucket 1 中的元素共享的子列表,因此我们打开一个新的 Bucket 2,以. 与 共享一个元素,因此也进入 Bucket 2。然后我们完成了 Bucket 2。得到它自己的 Bucket 3。['a', 'c']
['b', 'c']
['c', 'd']
c
['e', 'f']
['e', 'f']
['f', 'g']
['x', 'y']
我知道如何递归地做所有这些,但是l
非常大,我想知道是否有更快的方法将元素组合在一起!
解决方案
这段代码似乎工作:
l = [
['a', 'b'],
['a', 'c'],
['b', 'c'],
['c', 'd'],
['e', 'f'],
['f', 'g'],
['x', 'y']]
l2 = []
# merge lists to sets
for x in l:
for x2 in l2:
if len(x2 & set(x)):
x2 |= set(x)
break
else:
l2.append(set(x))
# output lists
d = {i:[] for i in range(len(l2))}
# match each list to set
for x in l:
for k in d:
if len(set(x) & set(l2[k])):
d[k].append(x)
# merge dictionary values
fl = [v for v in d.values()]
print(fl)
输出
[[['a', 'b'],
['a', 'c'],
['b', 'c'],
['c', 'd']],
[['e', 'f'],
['f', 'g']],
[['x', 'y']]]
推荐阅读
- python - 将字节转换为列表未按预期工作
- python - 参数范围和返回值的区别
- java - 期货嵌套是一种反模式吗?
- excel - 将图片从 Delphi cxGrid(或仅从 cxImage)导出到 Excel
- typescript - Typescript 泛型保留类型
- javascript - 在我的反应 js 项目中运行 npm start 时出现白屏
- imagemagick - 如何仅使用 ImageMagick 命令行保留红色
- maven - 如何解决 Cucumber Maven 项目中的“io.cucumber.core.backend.ObjectFactory”编译器错误?
- python - Django:psycopg2.errors.UndefinedColumn:“pages_page”关系的列“page_image”不存在
- android - 从 Gallery 获取图像 URI 并将其传递给另一个活动,看不到图像,获得异常