У меня есть список словарей, который выглядит следующим образом:

{'name': ['Sam'], 'where': ['London']},
{'name': ['Jon'], 'where': ['NY']},
{'name': ['Jon'], 'hobby': ['fifa']},
{'Age': ['20'], 'Country': ['US']},

У меня есть такой словарь, в котором может быть много одинаковых ключей, но у многих нет этого ключа. Как и в приведенном выше примере, у нас есть ключ имени в первых трех, но у нас нет ключа имени в четвертом. Я пытаюсь получить список всех значений, у которых есть ключ «имя».

Благодарность

1
python_pi 4 Окт 2022 в 21:22

5 ответов

То, что вы хотите, неясно (и ссылка на или ).

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

l = [{'name': ['Sam'], 'where': ['London']},
     {'name': ['Jon'], 'where': ['NY']},
     {'name': ['Jon'], 'hobby': ['fifa']},
     {'Age': ['20'], 'Country': ['US']},]

out = [d['name'] for d in l if 'name' in d]
# [['Sam'], ['Jon'], ['Jon']]

# or as flat list
out = [name for d in l if 'name' in d for name in d['name']]
# ['Sam', 'Jon', 'Jon']

# or just the first name
out = [d['name'][0] for d in l if 'name' in d]
# ['Sam', 'Jon', 'Jon']
1
mozway 4 Окт 2022 в 21:26
Спасибо. Однако я получаю эту ошибку: аргумент типа «NoneType» не является итерируемым
 – 
python_pi
4 Окт 2022 в 22:01
У вас нет в списке? пожалуйста, предоставьте воспроизводимый список, для которого возникает эта ошибка
 – 
mozway
4 Окт 2022 в 22:02

Вот способ извлечь все имена:

data = [
    {'name': ['Sam'], 'where': ['London']},
    {'name': ['Jon'], 'where': ['NY']},
    {'name': ['Jon'], 'hobby': ['fifa']},
    {'Age': ['20'], 'Country': ['US']},
]

names = [item['name'][0] for item in data if 'name' in item]
print(names)

Результат:

['Sam', 'Jon', 'Jon']
0
Robert Haas 4 Окт 2022 в 21:26

Я предполагаю, что ваши данные представляют собой список диктов.

data = [{'name': ['Sam'], 'where': ['London']},
{'name': ['Jon'], 'where': ['NY']},
{'name': ['Jon'], 'hobby': ['fifa']},
{'Age': ['20'], 'Country': ['US']},]

Вы можете получить подсписок всех элементов с ключом имени следующим образом:

output = [elem for elem in data if elem.get("name")]
0
bitflip 4 Окт 2022 в 21:27

Есть много способов сделать это. Один будет:

_list = [{'name': ['Sam'], 'where': ['London']},
{'name': ['Jon'], 'where': ['NY']},
{'name': ['Jon'], 'hobby': ['fifa']},
{'Age': ['20'], 'Country': ['US']}]

print(*(name for d in _list if (name := d.get('name'))))

Вывод:

['Sam'] ['Jon'] ['Jon']
0
OldBill 4 Окт 2022 в 21:28

Вы можете попробовать выражение списка:

all_dicts = [{'name': ['Sam'], 'where': ['London']},
{'name': ['Jon'], 'where': ['NY']},
{'name': ['Jon'], 'hobby': ['fifa']},
{'Age': ['20'], 'Country': ['US']}]

dicts_with_name = [d.values() for d in all_dicts if 'name' in d.keys() ]

Это извлекает все значения (для всех ключей) тех словарей в списке, у которых есть поле имени. Если вам нужны пары ключ-значение, вы можете d.items() вместо d.values()

0
userE 4 Окт 2022 в 21:29