Вернуть измененные копии словаря - PullRequest
4 голосов
/ 06 марта 2012

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

# This is the master dictionary.
d = {'fn' : 'Joseph', 'ln' : 'Randall', 'phone' : '100' }
# Joseph has got 4 other phone numbers
lst = ['200', '300', '400', '500']
# I want 4 copies of the dictionary d with these different phone numbers
# Later I would want to do some processing with those dictionary without affecting d

Поэтому я пытаюсьсделать это:

# y is the list I want to hold these copies of dictionaries with modified values
i = d.copy()
y = map( lambda x : (i.update({'phone' : x})) and i, lst )

Я думал, что это вернет список словарей, и у каждого из них будет изменен номер телефона на 200, 300, 400 и 500 соответственно.Я могу поставить цикл, создать копии и изменить их, используя наивный подход, но я хочу исследовать и знать, как я могу использовать лямбды для достижения этой цели.

Заранее спасибо.

1 Ответ

14 голосов
/ 06 марта 2012

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

>>> d = {'fn' : 'Joseph', 'ln' : 'Randall', 'phone' : '100' }
>>> lst = ['200', '300', '400', '500']
>>> [dict(d, phone=x) for x in lst]
[{'ln': 'Randall', 'phone': '200', 'fn': 'Joseph'}, {'ln': 'Randall', 'phone': '300', 'fn': 'Joseph'}, {'ln': 'Randall', 'phone': '400', 'fn': 'Joseph'}, {'ln': 'Randall', 'phone': '500', 'fn': 'Joseph'}]

Если вы все еще настаиваете на использовании map и лямбда-выражении (которое делает то же самое, только немного медленнее):

>>> map(lambda x: dict(d, phone=x), lst)
[{'ln': 'Randall', 'phone': '200', 'fn': 'Joseph'}, {'ln': 'Randall', 'phone': '300', 'fn': 'Joseph'}, {'ln': 'Randall', 'phone': '400', 'fn': 'Joseph'}, {'ln': 'Randall', 'phone': '500', 'fn': 'Joseph'}]

Кстати, причина, по которой ваш подход не работал должным образом, заключается в том, что .update() изменяет словарь на месте, а не создает новый словарь, отражающий обновление. Он также не возвращает результат, поэтому лямбда-выражение оценивается как None (и вы, вероятно, получили список типа [None, None, None, None].

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