Модификация списка словаря с использованием понимания списка - PullRequest
0 голосов
/ 30 июня 2018

Итак, у меня есть следующий список словаря

myList = [{'one':1, 'two':2,'three':3},
          {'one':4, 'two':5,'three':6},
          {'one':7, 'two':8,'three':9}]

Это просто пример словаря, который у меня есть. У меня вопрос, можно ли как-нибудь изменить, скажем, ключ two во всем словаре, чтобы он стал в два раза больше их значения, , используя понимание списка?

Я знаю, как использовать списки для создания нового списка словаря, но не знаю, как их изменить, я придумал что-то вроде этого

new_list = { <some if condiftion> for (k,v) in x.iteritems() for x in myList  }

Я не уверен, как указать условие в <some if condiftion>, также правильный ли формат понимания для вложенного списка?

Я хочу получить окончательный результат в соответствии с моим примером, подобным этому

[ {'one':1, 'two':4,'three':3},{'one':4, 'two':10,'three':6},{'one':7, 'two':16,'three':9}  ]

Ответы [ 5 ]

0 голосов
/ 30 июня 2018

В Python 3.5+ вы можете использовать новый синтаксис распаковки в dict-литералах, представленный в PEP 448 . Это создает копию каждого dict и затем перезаписывает значение для ключа two:

new_list = [{**d, 'two': d['two']*2} for d in myList]
# result:
# [{'one': 1, 'two': 4, 'three': 3},
#  {'one': 4, 'two': 10, 'three': 6},
#  {'one': 7, 'two': 16, 'three': 9}]
0 голосов
/ 30 июня 2018

Простая петля for должна быть достаточной. Однако, если вы хотите использовать словарное понимание, я нахожу определение словаря сопоставления более читабельным и расширяемым, чем троичные операторы:

factor = {'two': 2}

res = [{k: v*factor.get(k, 1) for k, v in d.items()} for d in myList]

print(res)

[{'one': 1, 'two': 4, 'three': 3},
 {'one': 4, 'two': 10, 'three': 6},
 {'one': 7, 'two': 16, 'three': 9}]
0 голосов
/ 30 июня 2018
myList = [ {'one':1, 'two':2,'three':3},{'one':4, 'two':5,'three':6},{'one':7, 'two':8,'three':9}  ]

[ { k: 2*i[k] if k == 'two' else i[k] for k in i } for i in myList ]

[{'one': 1, 'three': 3, 'two': 4}, {'one': 4, 'three': 6, 'two': 10}, {'one': 7, 'three': 9, 'two': 16}]
0 голосов
/ 30 июня 2018

Здравствуйте, вы пробовали это:

for d in myList:
  d.update((k, v*2) for k, v in d.iteritems() if k == "two")

Спасибо

0 голосов
/ 30 июня 2018

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

new_list = [{ k: v * 2 if k == 'two' else v for k,v in x.items()} for x in myList]
print (new_list)
[{'one': 1, 'two': 4, 'three': 3}, 
 {'one': 4, 'two': 10, 'three': 6}, 
 {'one': 7, 'two': 16, 'three': 9}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...