Как мне распечатать несколько ключей, которые соответствуют одному и тому же значению в Python? - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь написать код в Python, где пользователь вводит имя своего друга и любимый цвет этого друга в словарь. Затем программа возьмет эти ключи и значения и сначала распечатает цвет (значение), а затем всех друзей (ключ), которые были сопоставлены с этим значением.

Однако мне трудно распечатать несколько значений в одной строке с их общими ключами.

Вот мой код:


color_match = {}
while  True:
    key = input('type in the name: ')
    if key == '0':
        break
    value = input('Enter your friend\'s favorite color: ')
    if not (key and value):
        break
    color_match[key] = value

print(color_match)

print(color_match[key] + ":",key )

Допустим, мой входные параметры: {'Eri c': синий, 'Tom': красный, 'Bob': синий}. Получается такой результат:

blue: Eric
red: Tom
blue: Bob

Кто-нибудь может помочь? В этом примере мне нужно, чтобы Боб и Эри c находились на одной линии, соответствующей синему цвету.

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Похоже, что было бы разумнее структурировать ваш словарь наоборот, с ключами, представляющими каждый цвет, а значениями, состоящими из списков друзей, которые выбрали этот цвет.

Это можно сделать вот так:

from collections import defaultdict

color_match = defaultdict(list)
while True:
    value = input('Enter the name of your friend: ')
    if value == '0':
        break
    key = input('Enter your friend\'s favorite color: ')
    if not (key and value):
        break
    color_match[key].append(value)

print(color_match)

for key in color_match:
        print(f"{key}: {color_match[key]}")

Используя ваш пример, приведенное выше будет напечатать:

Blue: ['Eric', 'Bob']
Red: ['Tom']

Использование defaultdict со значением по умолчанию типа «список» вместо обычного словаря позволяет нам для добавления значений списка, даже если указанный ключ еще не существует.

Если вы хотите, чтобы в распечатанных результатах каждое имя было разделено запятыми, вы могли бы добиться этого, немного изменив последние несколько строк:

for key in color_match:
    array_string = ", ".join(color_match[key])
    print(f"{key}: {array_string}")

Одна вещь, о которой нужно помнить состоит в том, что «красный» и «красный» приведут к двум различным ключам словаря, поскольку они не являются идентичными строками. Для защиты от этого может быть полезно добавить строку:

value = value[0].upper() + value[1:].lower()

после блока "if value == '0':.

Это гарантирует, что «blue», «bLue», «BLUE» "или любой другой вариант будет отмечен как" Синий ".

0 голосов
/ 07 мая 2020

Используйте это:

color_match = {}
while True:
    nm = input('Enter the name of your friend: ')
    if nm == '0':
        break
    color  = input('Enter your friend\'s favorite color: ')
    if not (nm and color):
        break
    if color.lower() not in color_match.keys(): color_match[color.lower()]= nm
    else: color_match[color.lower()] += (f", {nm}")

print(color_match)

for key in color_match:
    print(key+ ":",color_match[key]  )

Вывод:

Enter the name of your friend: bob
Enter your friend's favorite color: blue
Enter the name of your friend: rob
Enter your friend's favorite color: BLuE
Enter the name of your friend: tom
Enter your friend's favorite color: green
Enter the name of your friend: 
Enter your friend's favorite color: 
{'blue': 'bob, rob', 'green': 'tom'}
blue: bob, rob
green: tom
>>> 
...