как получить значение ключа без циклического ввода в Python - PullRequest
0 голосов
/ 30 апреля 2020

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

ids = [{'1020': 'ID-2522'}, {'1030': 'ID-2523'}, {'1040': 'ID-2524'}]

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

data = [{'sf_id': '1020', TotalPrice': '504'}, {'sf_id': '1030', TotalPrice': '400'}, {'sf_id': '1040', TotalPrice': '500'}]

Вот мой для l oop:

for index, my_dict in enumerate(data):
    for key, value in my_dict.items():
         new_id = my_dict["sf_id"]
         opportunity = ids[new_id]

Так что он захватывает соответствующее значение. Желаемый результат будет:

print(opportunity)
ID-2522
ID-2523
ID-2524

Ответы [ 3 ]

0 голосов
/ 30 апреля 2020

Как отмечается в комментарии @ mad_, ids - это список диктов, а не диктат. Это делает поиск одного из ключей очень неэффективным, так как вам нужно будет go просмотреть весь список, чтобы найти его.

Итак, первым шагом является объединение всех этих маленьких диктовок в один большой.

Затем мы можем эффективно построить список с ожидаемым результатом:

ids = [{'1020': 'ID-2522'}, {'1030': 'ID-2523'}, {'1040': 'ID-2524'}]

data = [{'sf_id': '1020', 'TotalPrice': '504'}, 
        {'sf_id': '1030', 'TotalPrice': '400'}, 
        {'sf_id': '1040', 'TotalPrice': '500'}]

ids_dict = {k:v for dct in ids for k, v in dct.items()}

opportunity = []

for my_dict in data:
    new_id = my_dict["sf_id"]
    opportunity.append(ids_dict[new_id])

print(opportunity)
# ['ID-2522', 'ID-2523', 'ID-2524']

(обратите внимание, что вам не нужно enumerate, если вы не используете индекс)

Или, короче, с пониманием списка:

opportunity = [ids_dict[my_dict["sf_id"]] for my_dict in data]
print(opportunity)
#  ['ID-2522', 'ID-2523', 'ID-2524']
0 голосов
/ 01 мая 2020
# Create a new variable and save sftoap in it
new_ids = ids

# pop the items from original list of dicts and save it in a new dict 
sftoap_dict = {}
for d in new_ids:
    key, value = d.popitem()
    sftoap_dict[key] = value
0 голосов
/ 30 апреля 2020

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

from functools import reduce

ids = [{'1020': 'ID-2522'}, {'1030': 'ID-2523'}, {'1040': 'ID-2524'}]
data = [{'sf_id': '1020', 'TotalPrice': '504'}, {'sf_id': '1030', 'TotalPrice': '400'}, {'sf_id': '1040', 'TotalPrice': '500'}]

ids_map = reduce(lambda x, y: x.update(y) or x , ids, {})

for my_dict in data:
  new_id = my_dict["sf_id"]
  opportunity = ids_map[new_id]
  print(opportunity)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...