根据词典中的姓氏对名称进行排序

时间:2019-12-01 23:24:53

标签: python

所以我有一本充满名字的字典

我可以对键进行排序,但不确定如何合并值,我需要按以下格式更改值,但无法这样做,名称按键和值的姓氏排序

names = {john doe : ['jon doe' , 'j don']
         jonh don : ['latte late'] }

names = {doe: ['john', 'jon']
         don: ['jonh', 'j']
         late: ['latte']

1 个答案:

答案 0 :(得分:0)

您应该将键和值分别转换为新字典中的新元素。

我假设每个键都是字符串-因此您可以将其分为两部分

    parts = key.rsplit(' ', 1)

并在新字典中将零件用作关键和价值

    new_key = parts[-1]
    new_value = parts[0]
    new_names[new_key].append(new_value)

使用值的相同方法。但是因为每个值都是一个列表,所以它需要for循环才能单独使用列表中的每个元素。

我使用collections.defaultdict,因此不需要检查键是否存在或是否为所有值分配列表。最后,我可以将其转换为普通词典。

import collections

names = {
    "john doe": ['jon doe' , 'j don'],
    "jonh don": ['latte late'],
}

new_names = collections.defaultdict(list)

for item in names.keys():
    parts = item.rsplit(' ', 1)
    new_key = parts[-1]
    new_value = parts[0]
    new_names[new_key].append(new_value)

for value in names.values():
    for item in value:
        parts = item.rsplit(' ', 1)
        new_key = parts[-1]
        new_value = parts[0]
        new_names[new_key].append(new_value)

#for key, value in new_names.items():
#    print(key, value)

names = dict(new_names)

print(names)

结果:

{'doe': ['john', 'jon'], 'don': ['jonh', 'j'], 'late': ['latte']}