Использование цикла for для вставки значений списка в пустые списки во вложенном словаре - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть вложенный словарь:

my_dict = {
1: {'player_id': 1,
'player_name': 'Bryan_Demapan',
'time_played': 0.0,
'player_pokemon': {},
'gyms_visited': []},
2: {'player_id': 2,
'player_name': 'Tom Syneal',
'gyms_visited': [],
'player_pokemon': {},
'time_played': 0.0}}

Предположим, у меня есть список

new_list = ['A', 'B', 'C']

Как мне сделать оператор цикла for, который вставляет мой новый список во все пустые списки с ключом 'gyms_visited'?

новый словарь должен выглядеть следующим образом

my_dict = {
1: {'player_id': 1,
'player_name': 'Bryan_Demapan',
'time_played': 0.0,
'player_pokemon': {},
'gyms_visited': ['A', 'B', 'C']},
2: {'player_id': 2,
'player_name': 'Tom Syneal',
'gyms_visited': ['A', 'B', 'C'],
'player_pokemon': {},
'time_played': 0.0}}

Ответы [ 4 ]

0 голосов
/ 06 ноября 2018

Вы также можете просто extend() список:

for key in my_dict:
    my_dict[key]['gyms_visited'].extend(new_list)

и как вы можете видеть здесь, все списки имеют разные id() и не ссылаются на один и тот же объект:

print(id(new_list))
# 2704861952904

for key in my_dict:
    print(id(my_dict[key]['gyms_visited']))
# 2704833143368
# 2704833143432

С точки зрения производительности, list.extend() - это O (N), где N = 3 - длина списка, который вы хотите расширить. Скорее всего, это серия list.append() вызовов, каждый из которых O (1).

Это будет то же самое для копирования с использованием [:] или .copy(), то есть O (N).

0 голосов
/ 06 ноября 2018

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

new_list = ['A', 'B', 'C']
data = {1: {'player_id': 1, 'player_name': 'Bryan_Demapan', 'time_played': 0.0, 'player_pokemon': {}, 'gyms_visited': []}, 2: {'player_id': 2, 'player_name': 'Tom Syneal', 'gyms_visited': [], 'player_pokemon': {}, 'time_played': 0.0}}
new_data = {a:{c:[i for i in new_list if i not in d] if c == 'gyms_visited' else d \
    for c, d in b.items()} for a, b in data.items()}

Выход:

{
  "1": {
    "player_id": 1,
    "player_name": "Bryan_Demapan",
    "time_played": 0.0,
    "player_pokemon": {},
    "gyms_visited": ["A", "B", "C"]
 },
 "2": {
    "player_id": 2,
    "player_name": "Tom Syneal",
    "gyms_visited": ["A", "B", "C"],
    "player_pokemon": {},
    "time_played": 0.0
   }
}
0 голосов
/ 06 ноября 2018

Просто переберите значения my_dict и назначьте new_list ключу 'gyms_visited'

In [529]: for k, v in my_dict.items():
     ...:     v['gyms_visited'] = new_list.copy()
     ...:

In [530]: my_dict
Out[530]:
{1: {'gyms_visited': ['A', 'B', 'C'],
  'player_id': 1,
  'player_name': 'Bryan_Demapan',
  'player_pokemon': {},
  'time_played': 0.0},
 2: {'gyms_visited': ['A', 'B', 'C'],
  'player_id': 2,
  'player_name': 'Tom Syneal',
  'player_pokemon': {},
  'time_played': 0.0}}

Если вы просто назначите new_list, то у вас возникнут проблемы, как только вы измените любое значение в new_list

In [529]: for k, v in my_dict.items():
     ...:     v['gyms_visited'] = new_list
     ...:

In [531]: new_list[1] = 100

In [532]: my_dict
Out[532]:
{1: {'gyms_visited': ['A', 100, 'C'],
  'player_id': 1,
  'player_name': 'Bryan_Demapan',
  'player_pokemon': {},
  'time_played': 0.0},
 2: {'gyms_visited': ['A', 100, 'C'],
  'player_id': 2,
  'player_name': 'Tom Syneal',
  'player_pokemon': {},
  'time_played': 0.0}}
0 голосов
/ 06 ноября 2018

Попробуйте это:

print({idx:{k:(new_list if k=='gyms_visited' else v) for k,v in i.items()} for idx,i in enumerate(my_dict.values(),1)})

Понимание вложенного словаря будет работать.

Выход:

{1: {'player_id': 1, 'player_name': 'Bryan_Demapan', 'time_played': 0.0, 'player_pokemon': {}, 'gyms_visited': ['A', 'B', 'C']}, 2: {'player_id': 2, 'player_name': 'Tom Syneal', 'gyms_visited': ['A', 'B', 'C'], 'player_pokemon': {}, 'time_played': 0.0}}

Мне действительно нравится решение @ aydow. В дополнение к этому вы можете сделать это следующим образом:

for k,v in data.items():
   v['gyms_visited']=new_list[:]

Или:

import copy
for k,v in data.items():
   v['gyms_visited']=copy.deepcopy(new_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...