2012-03-06 5 views
4

У меня есть словарь и для конкретного ключа, я могу сказать 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 соответственно. Я могу поместить цикл и создать копии и изменить их, используя наивный подход, но я хочу исследовать и знать, как я могу использовать лямбда для достижения этого.

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

+0

Что еще вы пробовали? – Marcin

+2

@Marcin: «Я хочу изучить и знать, как я могу использовать lambdas, чтобы выполнить это ». – Benjamin

ответ

14

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

>>> 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].

+0

(+1) Это намного лучше, чем мое предложение. – NPE

+3

@aix: Спасибо :) Я узнал, что трюк недавно на SO, это действительно отличный сайт! –

+0

woow !! очень крутое решение! :) –

Смежные вопросы