Я пытаюсь создать словарь, используя ключи, полученные из [значений] кортежа, и значением этих ключей должен быть новый словарь, сформированный из ключей словаря, и значение подключа, инициализированное 0
.
Кортеж выглядит так:
characters = ('Fred', 'Sam', 'Bob', 'Daisy', 'Gina', 'Rupert')
Используемый словарь выглядит так:
jobs = {
'Pizzeria': 1,
'Mall Kiosk': 2
'Restaurant': 3
'Burger Joint': 4
'Department Store': 5
}
Я бы хотел, чтобы окончательная структура выглядела так:
jobsWorkedCounter = {
'Fred': {
'Pizzeria': 0,
'Mall Kiosk': 0
'Restaurant': 0
'Burger Joint': 0
'Department Store': 0
},
'Sam': {
'Pizzeria': 0,
'Mall Kiosk': 0
'Restaurant': 0
'Burger Joint': 0
'Department Store': 0
},
...
'Rupert': {
'Pizzeria': 0,
'Mall Kiosk': 0
'Restaurant': 0
'Burger Joint': 0
'Department Store': 0
},
}
Конечная цель состоит в том, чтобы иметь структуру для увеличения счетчиков:
jobsWorkedCounter['Fred']['Burger Joint'] += 1
Я пробовал использовать различные вложенные понимания:
jobsWorkedCounter = { char: dict((key, 0) for key in jobs.keys()) for char in characters }
# and
jobsWorkedCounter = { char: dict(jobs.keys(), 0) for char in characters }
# and
jobsWorkedCounterDict = { key: 0 for key in jobs.keys() }
jobsWorkedCounter = { char: jobsWorkedCounterDict for char in characters }
# and
jobsWorkedCounter = { char: { key: 0 for key in jobs.keys() } for char in characters }
и простой цикл for
:
jobsWorkedCounter = { char: {} for char in characters }
for char in characters:
jobsWorkedCounter[char] = dict.fromkeys(jobs.keys(), 0)
но лучшее, что мне удалось сделать, это один ключ вместо полного набора:
jobsWorkedCounter = {
'Fred': {
'Pizzeria': 0,
},
'Sam': {
'Pizzeria': 0,
},
...
'Rupert': {
'Pizzeria': 0,
},
}
Кажется, что что бы я ни пытался, мне удается свести новый словарь к одной паре ключ-значение, и это то, что присваивается ключу из кортежа.
Как я могу выполнить то, что я пытаюсь сделать?
Кроме того, на всякий случай, если я делаю это неправильно, чтобы проверить вывод, я делаю это:
keys = jobsWorkedCounter['Fred'].keys()
raise Exception(keys)
который получает меня:
Exception: [u'Pizzeria']
где я ожидал увидеть:
Exception: [u'Pizzeria', u'Mall Kiosk', u'Restaurant', u'Burger Joint', u'Department Store']
Я совершенно уверен, что этот метод просмотра ключей должен работать, потому что, если я изменю его на:
keys = jobsWorkedCounter.keys()
raise Exception(keys)
Я получил:
Exception: [u'Fred', u'Sam', u'Bob', u'Daisy', u'Gina', u'Rupert']
Я застрял в использовании Python 2.7, так как нахожусь в среде Ren'Py (отсюда и причина создания исключения для просмотра вывода).
Например:
from pprint import pprint
дает мне:
Import Error: No module named pprint
Использование понимания dict:
characters = ('Fred', 'Sam', 'Bob', 'Daisy', 'Gina', 'Rupert')
jobs = {
'Pizzeria': 1,
'Mall Kiosk': 2,
'Restaurant': 3,
'Burger Joint': 4,
'Department Store': 5
}
jobsWorkedCounter = {c: {k: 0 for k in jobs} for c in characters}
# For pretty print:
#from pprint import pprint
#pprint(jobsWorkedCounter)
print(jobsWorkedCounter)
Отпечатки:
{'Bob': {'Burger Joint': 0,
'Department Store': 0,
'Mall Kiosk': 0,
'Pizzeria': 0,
'Restaurant': 0},
'Daisy': {'Burger Joint': 0,
'Department Store': 0,
'Mall Kiosk': 0,
'Pizzeria': 0,
'Restaurant': 0},
'Fred': {'Burger Joint': 0,
'Department Store': 0,
'Mall Kiosk': 0,
'Pizzeria': 0,
'Restaurant': 0},
'Gina': {'Burger Joint': 0,
'Department Store': 0,
'Mall Kiosk': 0,
'Pizzeria': 0,
'Restaurant': 0},
'Rupert': {'Burger Joint': 0,
'Department Store': 0,
'Mall Kiosk': 0,
'Pizzeria': 0,
'Restaurant': 0},
'Sam': {'Burger Joint': 0,
'Department Store': 0,
'Mall Kiosk': 0,
'Pizzeria': 0,
'Restaurant': 0}}
Обновлено: Другая, явная версия:
zeroed_jobs = dict((k, 0) for k in jobs)
jobsWorkedCounter = {c: dict(**zeroed_jobs) for c in characters}
print(jobsWorkedCounter)
Исправлен вопрос, чтобы включить среду Ren'Py (куда я, по-видимому, не могу импортировать pprint
). Вывод, который я получаю от понимания словаря, не изменился... все, что я получаю, - это один подключ.
бег jobsWorkedCounter = {c: {k: 0 for k in jobs} for c in characters}
заводит меня Exception: [u'Pizzeria']
@pete Я обновил свой ответ и добавил другую (более явную) версию. Выполнение этого с Python2.7 дает мой правильный ответ на моем компьютере (как и первый)
@AndrejKesely Это потому, что он использует Ren'Py. Я не знаком с ним, но, если быстро его просмотреть, это не совсем Python...
@ norok2 Я вижу, быстро погуглил, кажется, это какая-то игра с программным аспектом? Интерпретатор, кажется, ограничен, хотя
@norok2, @AndrejKesely Ren'Py - это игровой движок, построенный на python 2.7, который позволяет вам смешивать реальный код Python с кодом игрового движка, и обычные питонические вещи работают должным образом (например, обычное понимание списка). На всякий случай добавил тег renpy
.
Также скопируйте/вставьте свою явную версию и получите тот же результат: Exception: [u'Pizzeria']
Я создал новый проект Ren'Py (из Ubuntu 18.04) и добавил следующий код в начало screens.rpy
.
Это в основном один из ваших предварительных вариантов:
init python:
characters = ('Fred', 'Sam', 'Bob', 'Daisy', 'Gina', 'Rupert')
jobs = {
'Pizzeria': 1,
'Mall Kiosk': 2,
'Restaurant': 3,
'Burger Joint': 4,
'Department Store': 5
}
jobsWorkedCounter = {char: {key: 0 for key in jobs.keys()} for char in characters}
keys = jobsWorkedCounter['Fred'].keys()
raise Exception(keys)
И я получаю:
I'm sorry, but an uncaught exception occurred.
While running game code:
File "game/screens.rpy", line 5, in script
init python:
File "game/screens.rpy", line 19, in <module>
raise Exception(keys)
Exception: [u'Department Store', u'Pizzeria', u'Restaurant', u'Mall Kiosk', u'Burger Joint']
-- Full Traceback ------------------------------------------------------------
Full traceback:
File "game/screens.rpy", line 5, in script
init python:
File "/usr/share/games/renpy/renpy/ast.py", line 848, in execute
renpy.python.py_exec_bytecode(self.code.bytecode, self.hide, store=self.store)
File "/usr/share/games/renpy/renpy/python.py", line 1812, in py_exec_bytecode
exec bytecode in globals, locals
File "game/screens.rpy", line 19, in <module>
raise Exception(keys)
Exception: [u'Department Store', u'Pizzeria', u'Restaurant', u'Mall Kiosk', u'Burger Joint']
Linux-4.15.0-55-generic-x86_64-with-Ubuntu-18.04-bionic
Ren'Py 6.99.14.1.3218
test_renpy 1.0
Wed Jul 24 21:03:28 2019
поэтому я склонен думать, что у вас есть ошибка где-то еще в вашем коде.
Попробовал (скопировал/вставил), и конечный результат такой же, как у меня (Exception: [u'Pizzeria']
)
@pete Я действительно проверил это в Ren'Py, и для меня это работает так, как и следовало ожидать. Должна быть какая-то другая проблема с вашими скриптами.
Хорошо, я понял проблему... Я загружал сохраненную игру (чтобы сэкономить время, а не проходить сюжетное вступление заново), и в сохраненной игре были старые значения для jobsWorkedCounter
, поэтому я был постоянно получать один и тот же результат снова и снова. Начал новую игру, и ваше решение, и решение @AndrejKesely действительно сработали, как и ожидалось. Приняв ваш ответ (но проголосовав за @AndrejKesely), как вы указали, это была ошибка в другом месте, которая заставила меня задуматься об этом в другом настроении. Спасибо вам обоим за вашу помощь.
все ваши решения будут работать на стандартном Python, возможно, вам следует заранее написать, что они на Ren'Py? Кроме того, все ваши испытания связаны с пониманием, может быть, вам нужно их избегать? Проверьте мой ответ, чтобы узнать, как это сделать.