将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']]
答案 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