对“键”和“值”中的所有值进行排序

时间:2019-12-02 03:00:05

标签: python

基本上,我正在尝试这样做: 与人一起返回“姓氏到名字”词典     从“人到朋友”字典person_to_friends。 而且我无法从重复中得到名字

>>>def get_last_to_first(
...person_to_friends: Dict[str, List[str]]) -> Dict[str, List[str]]
... get_last_to_first(P2F) == {
...    'Katsopolis': ['Jesse'],
...    'Tanner': ['Danny R', 'Michelle', 'Stephanie J'],
...    'Gladstone': ['Joey'],
...    'Donaldson-Katsopolis': ['Rebecca'],
...    'Gibbler': ['Kimmy'],
...    'Tanner-Fuller': ['DJ']}
True
P2F =      {'Jesse Katsopolis': ['Danny R Tanner', 'Joey Gladstone',
            'Rebecca Donaldson-Katsopolis'],
            'Rebecca Donaldson-Katsopolis': ['Kimmy Gibbler'],
            'Stephanie J Tanner': ['Michelle Tanner', 'Kimmy Gibbler'],
            'Danny R Tanner': ['Jesse Katsopolis', 'DJ Tanner-Fuller',
            'Joey Gladstone']}
"""
person = {}
person1 = {}
for key in person_to_friends.keys():
    num = key.rfind(' ')
    person[key[num:]] = [key[:num]]
for val in person_to_friends.values():
    for item in val:
        numf = item.rfind(' ')
        if item[numf:] not in person:
            person[item[numf:]] = [item[:numf]]
        else:
            person[item[numf:]].append(item[:numf])
print(person)

1 个答案:

答案 0 :(得分:0)

使用set代替list会自动为您修复:

def get_last_to_first(
        person_to_friends: Dict[str, List[str]]) -> Dict[str, List[str]]:
    """Return a "last name to first name(s)" dictionary with the people
    from the "person to friends" dictionary person_to_friends.

    >>> get_last_to_first(P2F) == {
    ...    'Katsopolis': ['Jesse'],
    ...    'Tanner': ['Danny R', 'Michelle', 'Stephanie J'],
    ...    'Gladstone': ['Joey'],
    ...    'Donaldson-Katsopolis': ['Rebecca'],
    ...    'Gibbler': ['Kimmy'],
    ...    'Tanner-Fuller': ['DJ']}
    True
    P2F =      {'Jesse Katsopolis': ['Danny R Tanner', 'Joey Gladstone',
                'Rebecca Donaldson-Katsopolis'],
                'Rebecca Donaldson-Katsopolis': ['Kimmy Gibbler'],
                'Stephanie J Tanner': ['Michelle Tanner', 'Kimmy Gibbler'],
                'Danny R Tanner': ['Jesse Katsopolis', 'DJ Tanner-Fuller',
                'Joey Gladstone']}
    """
    person = {}
    person1 = {}
    for key in person_to_friends.keys():
        num = key.rfind(' ')
        # person[key[num:]] = set([key[:num]])
        if key[num:] not in person:
            person[key[num:]] = set([key[:num]])
        else:
            person[key[num:]].add(key[:num])

    for val in person_to_friends.values():
        for item in val:
            numf = item.rfind(' ')
            if item[numf:] not in person:
                person[item[numf:]] = set([item[:numf]])
            else:
                person[item[numf:]].add(item[:numf])
    print(person)

修改 它不包含Stephanie J Tanner的原因是因为您覆盖了上面代码中更改的第一级密钥。


您可能会受益于python的list / dict理解和defaultdict使其更加美观。

from collections import defaultdict
def simple(p2f):
    all_names = set(x for k, v in p2f.items() for x in [k] + v)
    person = defaultdict(set)
    for p in all_names:
        *first_name, last_name = p.split()
        person[last_name].add(" ".join(first_name))
    print(person)
    return person