Инициализировать новый словарь из кортежа и ключей другого словаря

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

все ваши решения будут работать на стандартном Python, возможно, вам следует заранее написать, что они на Ren'Py? Кроме того, все ваши испытания связаны с пониманием, может быть, вам нужно их избегать? Проверьте мой ответ, чтобы узнать, как это сделать.

norok2 24.07.2019 20:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
1 275
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Использование понимания 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). Вывод, который я получаю от понимания словаря, не изменился... все, что я получаю, - это один подключ.

pete 24.07.2019 20:18

бег jobsWorkedCounter = {c: {k: 0 for k in jobs} for c in characters} заводит меня Exception: [u'Pizzeria']

pete 24.07.2019 20:21

@pete Я обновил свой ответ и добавил другую (более явную) версию. Выполнение этого с Python2.7 дает мой правильный ответ на моем компьютере (как и первый)

Andrej Kesely 24.07.2019 20:27

@AndrejKesely Это потому, что он использует Ren'Py. Я не знаком с ним, но, если быстро его просмотреть, это не совсем Python...

norok2 24.07.2019 20:28

@ norok2 Я вижу, быстро погуглил, кажется, это какая-то игра с программным аспектом? Интерпретатор, кажется, ограничен, хотя

Andrej Kesely 24.07.2019 20:31

@norok2, @AndrejKesely Ren'Py - это игровой движок, построенный на python 2.7, который позволяет вам смешивать реальный код Python с кодом игрового движка, и обычные питонические вещи работают должным образом (например, обычное понимание списка). На всякий случай добавил тег renpy.

pete 24.07.2019 20:51

Также скопируйте/вставьте свою явную версию и получите тот же результат: Exception: [u'Pizzeria']

pete 24.07.2019 20:52
Ответ принят как подходящий

Я создал новый проект 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 24.07.2019 20:49

@pete Я действительно проверил это в Ren'Py, и для меня это работает так, как и следовало ожидать. Должна быть какая-то другая проблема с вашими скриптами.

norok2 24.07.2019 21:06

Хорошо, я понял проблему... Я загружал сохраненную игру (чтобы сэкономить время, а не проходить сюжетное вступление заново), и в сохраненной игре были старые значения для jobsWorkedCounter, поэтому я был постоянно получать один и тот же результат снова и снова. Начал новую игру, и ваше решение, и решение @AndrejKesely действительно сработали, как и ожидалось. Приняв ваш ответ (но проголосовав за @AndrejKesely), как вы указали, это была ошибка в другом месте, которая заставила меня задуматься об этом в другом настроении. Спасибо вам обоим за вашу помощь.

pete 24.07.2019 21:21

Другие вопросы по теме