python - 如何将 python 列表与共享项合并到新列表中

标签 python list python-2.7 set intersection

我是 python 的新手,但遇到了障碍。我有一个 python 列表,每行包含一个列表。基本上,我想合并列表之间共享值的列表。例如, 下面是我的 python 列表目前的样子,以及我希望在执行其他命令后数据看起来像什么。

我知道这类问题非常适合集合和交集,但我无法让它们正常工作。我还看过一篇使用索引的帖子,但对我也没有用。

列表的样子:

[
    ['mary', 'home'],
    ['mary', 'school'],
    ['mary', 'work'],
    ['bob', 'home'],
    ['bob', 'school'],
    ['bob', 'work'],
    ['tom', 'work'],
    ['tom', 'school'],
    ['tom', 'home'],
    ['bill', 'vacation'],
]

我希望它看起来像什么:

[
    ['mary', 'bob', 'tom', 'home', 'school', 'work'],
    ['bill', 'vacation'],
]

最佳答案

您的示例数据表明顺序在您的输入数据中很重要,这会使情况复杂化。假设它实际上只是一个例子,顺序并不重要,集合确实是解决问题的理想方法:

data = [
    ['mary', 'home'],
    ['mary', 'school'],
    ['mary', 'work'],
    ['bob', 'home'],
    ['bob', 'school'],
    ['bob', 'work'],
    ['tom', 'work'],
    ['tom', 'school'],
    ['tom', 'home'],
    ['bill', 'vacation'],
]

combined = []

for subset in [set(d) for d in data]:
    for candidate in combined:
        if not candidate.isdisjoint(subset):
            candidate.update(subset)
            break
    else:
        combined.append(subset)

这使用了 Python 的 for-else构造,不是每个人都熟悉的。 combined 将包含一个集合列表,因此您可能希望根据您的用例将它们转换为列表。

关于python - 如何将 python 列表与共享项合并到新列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16223680/

相关文章:

Python 将IP转换为八进制地址

Python:脚本运行时文件为空,并执行顺序写入操作

Python list.remove for 循环 "x not in list"

python打印不带括号的整数和字符串列表列表

c# - 如何从通用列表中删除项目

python - 子区间的平均值 Python

python - 在Python中随机查找列表中可用位置的高效算法

python - python 中的模板文件评估

python - 计算 pandas 列中条目的频率,然后使用 X 轴字符串标签将它们绘制成图

python - 从科学杂志获取 xpath 时遇到问题,它返回一个没有元素的列表