我有一个带有类似键的python字典,我希望将所有键(和值)与第一部分(在本例中为名称或标题)收集到一个字典或列表中,以便之后找到最常见的值。作为旁注:我不知道存在多少个密钥副本(具有相同的第一部分)。这是3,但可能只有2或超过3。
{'name=a=AA': (2, 2), 'name=a_copy=AA': (3, 3), 'name=a_copy2=AA': (3, 2),
'title=b=AA': (1, 2), 'title=b_copy=AA': (3, 3), 'title=b_copy2=AA': (1, 2)}
这可能吗?我虽然使用key.split("=")[0]
答案 0 :(得分:2)
只需遍历键值并将它们收集到带有列表的字典中:
results = {}
for key, value in input_dict.items():
prefix = key.partition('=')[0]
results.setdefault(prefix, []).append((key, value))
使用str.partition()
分割第一部分;对于单分裂情况,这个速度更快。不过,您也可以使用key.split('=', 1)[0]
。
答案 1 :(得分:2)
使用defaultdict
:
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for key in D: # this is the original dictionary
... d[key.split("=")[0]].append(key)
...
>>> d
defaultdict(<class 'list'>, {'title': ['title=b_copy2=AA', 'title=b_copy=AA', 'title=b=AA'], 'name': ['name=a=AA', 'name=a_copy=AA', 'name=a_copy2=AA']})
答案 2 :(得分:0)
另一种方法是使用itertools.groupby
方法,并根据split
上=
的第一项对键进行分组:
>>> d
{'name=a=AA': (2, 2), 'name=a_copy2=AA': (3, 2), 'title=b=AA': (1, 2), 'name=a_copy=AA': (3, 3), 'title=b_copy=AA': (3, 3), 'title=b_copy2=AA': (1, 2)}
>>>
>>> dd = {}
>>>
>>> for k,v in groupby(d, key=lambda s:s.split('=')[0]):
if k in dd:
dd[k].extend(list(v))
else:
dd[k] = list(v)
>>> dd
{'name': ['name=a=AA', 'name=a_copy2=AA', 'name=a_copy=AA'], 'title': ['title=b=AA', 'title=b_copy=AA', 'title=b_copy2=AA']}