Питон / наборы / словарь / инициализация

Может кто-нибудь объяснить, помочь мне понять, как работает этот бит кода? В частности, как работает назначение myHeap. Я знаю, что переменная freq назначается в качестве словаря. Но как насчет моего myHeap? это набор?

    exe_Data = {
      'e' : 0.124167,
      't' : 0.0969225,
      'a' : 0.0820011,
      'i' : 0.0768052,
     }

    freq = exe_Data)

    myHeap = [[pct, [symbol, ""]] for symbol, pct in freq.items()]

3 ответа

Решение
exe_Data = {
  'e' : 0.124167,
  't' : 0.0969225,
  'a' : 0.0820011,
  'i' : 0.0768052,
 }

Приведенный выше код создает словарь с именем "exe_Data". Другой способ сделать это - использовать встроенный конструктор dict() с аргументами ключевого слова следующим образом: exe_Data = dict(e=0.12467, t=0.0969225, a=0.0820011, i=0.0768052)

freq = exe_Data)

Я думаю, что выше следует прочитать freq=exe_Data, Это делает еще одну ссылку на словарь, созданный в предыдущем бите.

myHeap = [[pct, [symbol, ""]] for symbol, pct in freq.items()]

Эта последняя часть создает список, используя понимание списка. Он создает список списков из двух вещей: во-первых, это ключ из словаря, созданного и упомянутого выше, а во-вторых, это список, содержащий соответствующее значение из словаря и пустую строку.

РЕДАКТИРОВАТЬ: В ответ на комментарий, это будет эквивалентно написанию:

myHeap = []
for key, val in freq.items():
    myHeap.append([key, [val, ""]])

freq это ссылка на словарь, как вы сказали.

myHeap построен с использованием понимания списка, и поэтому это список. Общая форма понимания списка:

[ expr for x in iterable ]

Так myHeap будет список, каждый элемент которого является списком, причем первый элемент является значением соответствующей записи словаря, а второй элемент является другим списком, первый элемент которого является соответствующим ключом словаря, а второй элемент является "",

В вашем примере кода нет наборов.

Вы можете видеть, что это работает так (я отредактировал вывод числа для удобства чтения):

>>> [ symbol for symbol, pct in freq.items() ]
['a', 'i', 'e', 't']
>>> from pprint import pprint  # Yay, pretty printing
>>> pprint([ [pct, symbol] for symbol, pct in freq.items() ])
[[0.0820011, 'a'],
 [0.0768052, 'i'],
 [0.1241670, 'e'],
 [0.0969225, 't']]
>>> pprint([ [pct, [symbol, ""]] for symbol, pct in freq.items() ])
[[0.0820011, ['a', '']],
 [0.0768052, ['i', '']],
 [0.1241670, ['e', '']],
 [0.0969225, ['t', '']]]

Обратите внимание, что, поскольку словари в Python не сохраняют порядок своих элементов, нет никакой гарантии, что порядок freq элементы в конечном итоге в myHeap,

Я полагаю, вы имели в виду

freq = exe_Data

В этом случае myHeap будет выглядеть так:

[ [0.124167, ['e', ""]],
  [0.0969225, ['t', ""]],
  [0.0820011, ['a', ""]],
  [0.0768052, ['i', ""]]
]

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

По сути, он просто меняет порядок вашего ключа / значения вашего словаря и по какой-то причине помещает ключ в подмассив.

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