我有一个元组的输入列表,其条目是:
input_1 = [('v1',['f1','f2','f3']),('v2',['f1','f2','f4']),('v3',['f1','f2','f4'])]
^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^
我想知道是否有办法获取包含“group”的元组列表,如下所示:
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或干净的选择?对不起,如果这个问题没有得到很好的建议,但感谢您的任何意见。
答案 0 :(得分:4)
你可以迭代这两个级别,然后重建输入翻转水平;它可以帮助你完成大部分工作。主要问题是你如何对v
分享f
的{{1}}进行分组......有不同的排列可以给你与蒂姆建议相同的结果。
无论如何:这是一个开始。
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']}