2

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

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 新手,我无法从我看到的示例中弄清楚如何做到这一点:

在 Python 中按集合成员资格对整数进行分组

确保列表中的所有 dicts 具有相同的键

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

4

1 回答 1

4

您可以遍历两个级别,然后重建输入翻转级别;它让你大部分时间。主要问题是您将如何v对共享f's 的 's 进行分组......有不同的排列可以为您提供与 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']}
于 2013-09-12T05:16:24.053 回答