сравнить значение из списка со значением ключа из словаря Python - PullRequest
2 голосов
/ 22 апреля 2020

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

need_placeholder = ['1200', '1300', '1400']
ad_dict = [{"Name": "A", "ID": "1999"}, {"Name": "B", "ID": "1299"}, 
           {"Name": "C", "ID": "1400"}]

Мне нужно проверить, равны ли need_placeholders элементы значению ID из ad_dict. Вот мой сценарий:

for item in need_placeholder:
    adpoint_key = item 
    for index, my_dict in enumerate(ad_dict):
        if my_dict["ID"] == adpoint_key:
            continue
        else:    
            print(f'No key exists for {adpoint_key}')

Вывод:

No key exists for 1200
No key exists for 1200
No key exists for 1200
No key exists for 1300
No key exists for 1300
No key exists for 1300

Мой желаемый вывод:

No key exists for 1200
No key exists for 1300

Как я могу сравнить эти значения, не просматривая словарь или список?

Ответы [ 5 ]

1 голос
/ 22 апреля 2020
allowed_values = {dic["ID"] for dic in ad_dict}

for item in need_placeholder:
    if item not in allowed_values:
        print(f'No key exists for {item}')
1 голос
/ 22 апреля 2020

Вы можете попробовать это.

>>> need_placeholder = ['1200', '1300', '1400']
>>> ad_dict = [{"Name": "A", "ID": "1999"}, {"Name": "B", "ID": "1299"}, 
               {"Name": "C", "ID": "1400"}]
>>> keys={d['ID'] for d in ad_dict} # Set of all unique ID values
>>> [key for key in need_placeholder if not key in keys]
# ['1200', '1300']

Вы можете использовать itertools.filterfalse

list(filterfalse(lambda x:x in keys, need_placeholder))
# ['1200', '1300']

Если вас не волнует заказ

set(need_placeholder)-keys
# {'1300', '1200'}

Использование all

>>> for key in need_placeholder:
...     if all(key != d['ID'] for d in ad_dict):
...         print(f'No key exists for {key}')
...
No key exists for 1200
No key exists for 1300

Использование for-else

>>> for key in need_placeholder:
...     for d in ad_dict:
...             if key==d['ID']:
...                     break
...     else:
...             print(f'No key {key}')
...
No key 1200
No key 1300
1 голос
/ 22 апреля 2020

У вас есть else в неправильном месте в l oop. Этот внутренний l oop работает несколько раз для каждого из них. Вы можете полностью избежать l oop, если сначала вытащите значения ID в набор:

need_placeholder = ['1200', '1300', '1400']
ad_dict = [{"Name": "A", "ID": "1999"}, {"Name": "B", "ID": "1299"}, {"Name": "C", "ID": "1400"}]

ad_values = set(d['ID'] for d in ad_dict)

for v in need_placeholder:
    if v not in ad_values:
        print(f'no key exits for {v}')

Отпечатки:

no key exits for 1200
no key exits for 1300

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

for v in set(need_placeholder) - ad_values:
    print(f'no key exits for {v}')
0 голосов
/ 22 апреля 2020
for item in need_placeholder:
    adpoint_key = item
    duplicate_exist = False # flag that will be update if key exists
    for index, my_dict in enumerate(ad_dict):
        if my_dict["ID"] == adpoint_key:
            duplicate_exist = True    # flag is updated as key exists
    not duplicate_exist and print(f'No key exists for {adpoint_key}') # for all non duplicate print function is invoked at the end of inner loop
0 голосов
/ 22 апреля 2020

Быстрый способ сделать это - использовать понимание вложенного списка

[print('No key for {}'.format(x)) for x in need_placeholder if x not in [y['ID'] for y in ad_dict]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...