python中 怎么对字典中key具有包含关系的字符串进行合并?

例如 有个字典{'abcd':[1,2,3],'bcd':[1,2,3],'abcd':[2,3,4],'bcd':[2,3,4]}
对于值相同且key具有包含关系进行合并,成{'abcd':[1,2,3],'abcd':[2,3,4]}
怎么用python实现啊?

1. python中一个字典不能有同一个键对应多个值的情况存在. 你给的样例若直接赋值给某个字典变量将会是如下效果:
>>> d = {'abcd':[1,2,3],'bcd':[1,2,3],'abcd':[2,3,4],'bcd':[2,3,4]}
>>> d
{'abcd': [2, 3, 4], 'bcd': [2, 3, 4]}
>>>
同键的后值覆盖前值;
2. 字典合并操作要视你的合并算法而定,例如:
>>> d0 = {'abcd':[1,2,3],'bcd':[1,2,3]}
>>> d1 = {'abcd':[2,3,4],'bcd':[2,3,4]}
>>> # 列表叠加:
>>> for k,v in d1.items():
... d0[k] = d0.get(k,[])+v
...
>>> d0
{'abcd': [1, 2, 3, 2, 3, 4], 'bcd': [1, 2, 3, 2, 3, 4]}
>>> # 合并为无重复项的条目
>>> for k,v in d1.items():
... d0[k] = list(set(d0.get(k,[])+v))

>>> d0 = {'abcd':[1,2,3],'bcd':[1,2,3]}
>>> for k,v in d1.items():
... d0[k] = list(set(d0.get(k,[])+v))
...
>>> d0
{'abcd': [1, 2, 3, 4], 'bcd': [1, 2, 3, 4]}
>>>追问

谢谢您的回答 但是可能我的例子 可能没有举得很好 我的意思是在值相同的情况下对键进行合并,而值是列表
例如:{'abcd':[1,2,3],'bcd':[2,3,4],'bc':[1,2,3],'cd':[2,3,4]}合并成为
{'abcd':[1,2,3],'bcd':[2,3,4]}

追答

>>> d = {'abcd':[1,2,3],'bcd':[2,3,4],'bc':[1,2,3],'cd':[2,3,4]}
>>> d
{'abcd': [1, 2, 3], 'bcd': [2, 3, 4], 'cd': [2, 3, 4], 'bc': [1, 2, 3]}
>>> target = {}
>>> for k,v in d.items():
for element in k:
target.setdefault(str(v),set()).add(element)

>>> dn = dict([(''.join(sorted(list(v))),eval(k)) for k,v in target.items()])
>>> dn
{'bcd': [2, 3, 4], 'abcd': [1, 2, 3]}
>>>

追问

谢谢您的回答 我用我运行的数据 发现这样运行的结果 没办法区分键的字符串中含有相同字符串以及不按字典序排序的情况
例如:{'acbd':[1,2,3],'cbd':[2,3,4],'cb':[1,2,3],'cb':[2,3,4]}
会合并成为 {'abcd':[1,2,3],'bcd':[2,3,4]} 这样就改变了原先字符串的顺序

追答

有由相同值分组可以得到所有相关键的列表,这事儿的关键在于新字典的键如何生成需要你先明确一个逻辑。
例如 ['abcd','cbd','dc'] 转换为 ?

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-09
dv = {'abcd':[1,2,3],'bcd':[2,3,4],'bc':[1,2,3],'cd':[2,3,4]}
delkey = []
for key1 in dv:
for key2 in dv:
if key2 != key1 and key2 in key1 and dv[key2] == dv[key1]:
delkey.append(key2)

for key in delkey:
del dv[key]
相似回答