【问题标题】:Python: Group List by Set of KeysPython:按组键分组列表
【发布时间】:2013-09-12 05:04:36
【问题描述】:

我有一个元组的输入列表,其条目是:

input_1 = [('v1',['f1','f2','f3']),('v2',['f1','f2','f4']),('v3',['f1','f2','f4'])]
                  ^^^^^^^^^               ^^^^^^^^^               ^^^^^^^^^

我想知道是否有办法获取包含“组”的元组列表,如下所示:

output_1 = [(['f1','f2'],['v1','v2','v3']) , (['f3'],['v1']), (['f4'],['v2','v3'])]

如果信息不足,其他输入/输出可能是:

input_2 = [('v1',['f1']),('v2',['f2','f3']),('v3',['f4'])]

output_2 = [(['f1'],['v1']) , (['f2','f3'],['v2']), (['f4'],['v3'])]

或

input_3 = [('v1',['f1','f2']),('v2',['f1','f2']),('v3',['f3']),('v4',['f1','f2'])]
                  ^^^^^^^^^          ^^^^^^^^^                        ^^^^^^^^^

output_3 = [(['f1','f2'],['v1','v2','v4']) , (['f3'],['v3'])]

我认为可能有一种方法可以通过实现字典来实现这一点,但我是 Python 新手,我无法从我看到的示例中弄清楚如何做到这一点:

Grouping integers by set membership in Python

Make sure all dicts in a list have the same keys

我想我可以通过一堆 for 循环低效地做到这一点,但是有没有 Pythonic 或干净的替代方案?抱歉,如果这个问题没有很好地提出,但感谢您的任何意见。

【问题讨论】:

  • 棘手。您期望[('v1'),['f1','f2','f3']),('v2',['f2','f3','f4'])] 或[('v1'),['f1','f2','f3']),('v2',['f1','f4','f3'])] 的输出是什么? [('v1'),['f1','f2','f3']),('v2',['f2','f3','f4']),('v3',['f1','f2','f4'])]呢?
  • @TimPietzcker,我希望:[('f1',['v1']),(['f2','f3'],['v1','v2']), (['f4'],['v2'])] 第一个...
  • 对于第二个,假设您的意思是:[(['v1'],['f1','f2','f3']),('v2',['f1', 'f4','f3'])],输出应该是:[(['f1','f3'],['v1','v2']),(['f2'],['v1' ]),(['f4'],['v2'])]。抱歉,如果我对输出元组中的第一个元素是列表还是字符串不一致,它总是可以是列表。

标签: python list key set tuples


【解决方案1】:

您可以遍历两个关卡,然后重新构建输入,翻转关卡;它让你大部分时间。主要问题是您如何对共享 f 的 v 进行分组...有不同的排列可以为您提供与 Tim 建议的相同的结果。

无论如何:这是一个开始。

from collections import defaultdict

input_1 = [('v1',['f1','f2','f3']),
           ('v2',['f1','f2','f4']),
           ('v3',['f1','f2','f4'])]
input_2 = [('v1',['f1']),
           ('v2',['f2','f3']),
           ('v3',['f4'])]
input_3 = [('v1',['f1','f2']),
           ('v2',['f1','f2']),
           ('v3',['f3']),
           ('v4',['f1','f2'])]

def group(inp):
    out = defaultdict(list)
    for group in inp:
        key = group[0]
        for entry in group[1]:
            out[entry].append(key)
    return dict(out)

输出如下所示:

print group(input_1)
# {'f1': ['v1', 'v2', 'v3'], 
#  'f2': ['v1', 'v2', 'v3'], 
#  'f3': ['v1'], 
#  'f4': ['v2', 'v3']}
print group(input_2)
# {'f1': ['v1'], 
#  'f2': ['v2'], 
#  'f3': ['v2'], 
#  'f4': ['v3']}
print group(input_3)
# {'f1': ['v1', 'v2', 'v4'], 
#  'f2': ['v1', 'v2', 'v4'], 
#  'f3': ['v3']}

【讨论】:

  • +1,然后您可以进行第二次循环以找到所有具有相同值的键并将它们连接在一起。
  • 看起来很棒!其余的应该很容易,尽管我想知道是否有更简洁的方法,只是因为我对 Python 的列表推导印象深刻。再说一次,我对字典还不熟悉。无论哪种方式,我认为这都行,谢谢!
  • @TimPietzcker 我认为正如你所暗示的那样,这可能比看起来更困难(见图)
  • 感谢您的详尽解答!你是如何制作这个图形的?我想我理解这种区别。我相信对于我的应用程序,任何可能的输出都会起作用。对于我的应用程序来说,关键是当 v 的列表很大并且包含在许多 f 组中时,唯一元组的数量会变小。谢谢@Nick T!
  • @Charlie 在 Excel 中又快又脏(本来打算在 MSPaint 中绘制它,但我的平板电脑是个混蛋)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多