Python在dicts上使用groupby

时间:2015-03-26 07:25:06

标签: python list dictionary

将dict作为输入,输出应如下所示(必须将具有公共元素的键分组)。我一直在尝试使用groupby来完成这项任务,但是,我无法弄明白。你能帮忙吗? groupby文档对我来说有点难以理解。

input = {'c1': ['f1', 'f2', 'f3'], 
         'c2': ['f2'],
         'c3': ['f4'],
         'c4': ['f5', 'f4'],
         'c5': ['f3'],
         'c6': ['f6']}
output = [['c1', 'c2', 'c5'], ['c3', 'c4'], ['c6']]

2 个答案:

答案 0 :(得分:0)

请检查一下。看起来不是一个非常干净的解决方案。但是工作:) 我用过集来检查dict的值是否有共同点。将检查groupby如何做到这一点。

input_list = [{'c1': ['f1', 'f2', 'f3']}, {'c2': ['f2']}, {'c3': ['f4']}, {'c4': ['f5', 'f4']}, {'c5': ['f3']}, {'c6': ['f6']} ]

result_list = []

for input_item in input_list:
    input_key, input_value = input_item.items()[0]
    if not result_list:
        result_list.append([[input_key], input_value])
        continue
    for index, result_item in enumerate(result_list):
        result_keys, result_value = result_item
        if set(result_value).intersection(input_value):
            result_keys.append(input_key)
            result_list[index] = [result_keys, list(set(result_value).union(input_value))]
            break
    else:
        result_list.append([[input_key], input_value])

print [result[0] for result in result_list]  #prints [['c1', 'c2', 'c5'], ['c3', 'c4'], ['c6']]

答案 1 :(得分:0)

您可以更清楚地解释输入和输出之间的逻辑。

input = {'c1': ['f1', 'f2', 'f3'], 
         'c2': ['f2'],
         'c3': ['f4'],
         'c4': ['f5', 'f4'],
         'c5': ['f3'],
         'c6': ['f6']}

result = []
founded = set()
for k,v in input.items():
    res = set()
    res.add(k)

    for l,m in input.items():
        if set(v) - set(m) != set(v):
            founded.add(l)
            res.add(l)
    for r in result:
        if res.issubset(r):
            res = None
            break
    if res: result.append(res)
print result