Функция Range () изменяет целые числа (значения) в словаре на объекты - PullRequest
0 голосов
/ 11 июня 2019

Я хочу, чтобы значения были целыми числами, назначенными для ключей, но вместо этого, когда я генерирую целые числа в качестве значений, я создаю объект.

Это мой код:

prices_for_letters = dict.fromkeys(string.ascii_lowercase, (i for i in range(1, 27)))

Фактический результат:

{'a': <generator object main.<locals>.<genexpr> at 0x0000022AB7EF6D68>, 
 'b': <generator object main.<locals>.<genexpr> at 0x0000022AB7EF6D68>
 ...}

Ожидаемый результат:

{'a': 1, 'b': 2, ...}

Ответы [ 3 ]

1 голос
/ 11 июня 2019

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

from pprint import pprint
from string import ascii_lowercase

prices_for_letters = {ascii_lowercase[i]: i+1 for i in range(26)}
pprint(prices_for_letters)

Выход:

{'a': 1,
 'b': 2,
 'c': 3,
 'd': 4,
 'e': 5,
 'f': 6,
 'g': 7,
 'h': 8,
 'i': 9,
 'j': 10,
 'k': 11,
 'l': 12,
 'm': 13,
 'n': 14,
 'o': 15,
 'p': 16,
 'q': 17,
 'r': 18,
 's': 19,
 't': 20,
 'u': 21,
 'v': 22,
 'w': 23,
 'x': 24,
 'y': 25,
 'z': 26}
1 голос
/ 11 июня 2019

Используйте zip вместо:

import string
prices_for_letters = dict(zip(string.ascii_lowercase, range(1,27)))
print(prices_for_letters)
#{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 
# 'i': 9, 'h': 8, 'k': 11, 'j': 10, 'm': 13, 'l': 12, 
# 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 19, 'r': 18, 
# 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}
0 голосов
/ 11 июня 2019
  1. ОБЪЯСНЕНИЕ ПРОБЛЕМЫ С ВАШИМ КОДОМ:

Похоже, вы хотели использовать понимание списка, но в итоге вы выбрали (i for i in range(1, 27)), и в результате создается генератор, который загружает только каждыйпункт один за другим во время итерации вместо генерации всего списка заранее.Это хорошо для сохранения памяти, но это не то, что вы хотели.Поэтому вам следует использовать понимание списка, как показано ниже, для вашего второго параметра.

>>> [i for i in range(1, 27)]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]

Когда вы исправите это, как показано ниже, вы все равно не получите то, что хотите ...

>>> prices_for_letters = dict.fromkeys(list(string.ascii_lowercase), [i for i in range(1, 27)])
>>> prices_for_letters
{'a': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
'b': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
'c': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
'd': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
...
'w': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
'x': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
'y': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
'z': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]}

Это потому, что метод dict.fromkeys() в том виде, в котором вы его использовали, сопоставляет каждый элемент в первом параметре со вторым параметром.В этом случае весь список присваивается каждой клавише.

Это не то, что вам нужно, и поэтому вы должны использовать zip, как показано ниже:

>>> prices_for_letters = dict(zip(list(string.ascii_lowercase), [i for i in range(1, 27)]))
>>> prices_for_letters
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7,
'h': 8, 'i': 9, 'j': 10, 'k': 11, 'l': 12, 'm': 13, 'n': 14,
'o': 15, 'p': 16, 'q': 17, 'r': 18, 's': 19, 't': 20, 'u': 21,
'v': 22, 'w': 23, 'x': 24, 'y': 25, 'z': 26}

zip создает отображение элементов между списками и возвращает список кортежей.Когда мы конвертируем кортеж в словарь, явно используя dict(the_tuple), первый элемент кортежа становится ключом, а другой элемент становится значением.Но это все еще недостаточно хорошо;это слишком много кода.Мое предлагаемое решение ниже.

ПРЕДЛАГАЕМОЕ РЕШЕНИЕ
>>> prices_for_letters = dict(zip(string.ascii_lowercase, range(1,27)))
>>> prices_for_letters
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 
'j': 10, 'k': 11, 'l': 12, 'm': 13, 'n': 14, 'o': 15, 'p': 16, 'q': 17,
'r': 18, 's': 19, 't': 20, 'u': 21, 'v': 22, 'w': 23, 'x': 24, 'y': 25,
'z': 26}
...