3

我是 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'],
]
4

1 回答 1

3

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

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将包含一个集合列表,因此您可能希望根据您的用例将它们转换为列表。

于 2013-04-26T13:27:49.383 回答