2016-09-24 1 views
3

Если я создаю словарь python с пониманием dict, но есть дубликаты ключей, я гарантирую, что последний элемент будет тем, который попадает в последний словарь? Мне непонятно смотреть на https://www.python.org/dev/peps/pep-0274/?Является ли понимание python dict всегда «последним выигрышем», если есть повторяющиеся ключи

new_dict = {k:v for k,v in [(1,100),(2,200),(3,300),(1,111)]} 
new_dict[1] #is this guaranteed to be 111, rather than 100? 
+1

Да, последнее значение будет добавлено. если вы сделали это явно за пределами понимания 'new_dict [1] = 111', вы ожидали бы 100 или 111? Просто потому, что он в понимании не делает порядок вставок другим. –

+1

Это всегда будет последнее значение, это как перезапись предыдущего! – coder

+0

Последнее значение, которое Итерируемый дает понимание, будет тем, которое написано последним. –

ответ

4

Последний пункт выигрывает. Лучшая документация я могу найти для этого в Python 3 language reference, section 6.2.7:

A Dict понимании, в отличии от списка и установить постижения, необходимо два выражения, разделенное двоеточие следует обычному «за» и «если» статьи , Когда выполняется понимание, результирующие элементы ключа и значения вставляются в новый словарь в том порядке, в котором они производятся.

Эта документация также четко указано, что последний элемент выигрывает для пар ключ-значение, разделенных запятыми ({1: 1, 1: 2}) и для словаря распаковка ({**{1: 1}, **{1: 2}}):

Если разделенных запятыми последовательность ключа/дат-пары, ... вы можете указать один и тот же ключ несколько раз в списке key/datum, и последнее значение словаря для этого ключа будет последним.

Двойная звездочка ** обозначает словарь распаковка. Его операнд должен быть отображением. Каждый элемент сопоставления добавляется в новый словарь. Более поздние значения заменяют значения, уже установленные более ранними парами key/datum и ранее распакованными словарями.

1

Если вы имеете в виду что-то вроде

{key: val for (key, val) in pairs} 

где pairs представляет собой упорядоченный набор (например, список или кортеж) из списков 2-элементов или кортежей, тогда да, понимание будет принимать сбор в порядке и последнее значение «выиграет».

Обратите внимание, что если пары - это множество пар, то нет «последнего элемента», поэтому результат не предсказуем. Пример:

>>> n = 10 
>>> pairs = [("a", i) for i in range(n)] 
>>> {key:val for (key, val) in pairs} 
{'a': 9} 
>>> {key:val for (key, val) in set(pairs)} 
{'a': 2}