在python dict中收集相同的键(仅通过键的第一部分)?

时间:2015-12-23 10:48:00

标签: python dictionary

我有一个带有类似键的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]

3 个答案:

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