Почему мой код не работает при извлечении значений из dict - PullRequest
1 голос
/ 29 сентября 2019

Я прошел по ссылке Доступ к значениям DICT в Python с помощью начальных символов ключа

my = [{'k1': 'a','k2': '1234','k3':'12'},
    {'k1': 'a','k2': '1295','k3':'12'}]

for i in my:
    #print ([ v for k,v in i.items() if str(v).startswith('12')])
    print ([ v for k,v in i.items() if i['k2'].startswith('12')])

Мой выход

['a', '1234', '12']
['a', '1295', '12874']

Ожидается

['1234']
['1295']

Ответы [ 2 ]

3 голосов
/ 29 сентября 2019

Вы можете пропустить внешний список и использовать понимание списка:

my = [{'k1': 'a','k2': '1234','k3':'12'},
    {'k1': 'a','k2': '1295','k3':'12'}]

print([x['k2'] for x in my if x['k2'].startswith('12')])

Проблема с исходным кодом заключается в дополнительном обходе всех записей в i, если у него есть ключ 'k2' со значением, начинающимся с '12'.Это может быть записано как:

for i in my:
    if i['k2'].startswith('12'):
        print(i['k2'])

Обратите внимание, что код поднимает KeyError, если 'k2' не существует на одном из диктов, поэтому вы можете использовать

[x['k2'] for x in my if 'k2' in x and x['k2'].startswith('12')]

если вы предвидите этот сценарий.

0 голосов
/ 29 сентября 2019

Вы получите этот результат, потому что условие i['k2'].startswith('12') всегда возвращает True.(либо i['k2']='1234', либо i['k2']='1295'), поэтому все значения принимаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...