2013-12-02 4 views
0

Прежде всего, я прав предположить, что для:питона: итерация большого словаря

dict1 = {'a':['b','c']} 
(key,value), = dict1.items() 

ЦЕССИОНАРИЯМА «ключа», чтобы быть ключи Dict и «значение», чтобы быть значениями Сыроватского? также, почему это запятая после (ключ, значение), необходимо?

и на мой вопрос:
Как сделать это в более крупном словаре с 5 + значениями на ключ? когда я пытаюсь сделать это на моем Словаре, он говорит следующее:

builtins.ValueError: too many values to unpack (expected 1) 

есть способ сделать это без модуля itertools?

+0

Вместо того, предполагается, что вы всегда можете на самом деле * * запустить код. Это прямо перед вами. Я предполагаю, что он возьмет первый ключ и значение в dict и назначит им «ключ» и «значение» соответственно. Если ошибка, которую вы получаете, на самом деле из этого кода, тогда она просто не будет работать, если 'dict' имеет более одного элемента. Запятая необходима, потому что вы деконструируете последовательность * из одного элемента * кортежей '(key, value)', поэтому вам нужно назначить это кортеж переменных из одного элемента. (И каждая из этих переменных сама по себе является двухпозиционным кортежем.) – millimoose

+0

Если это сбивает с толку, часть его связана с тем, что то, что вы делаете, вероятно, не является правильным способом выполнить то, что вы пытаетесь сделать, о чем вы не слишком хорошо описали. Вы должны предоставить образец кода, который фактически вызывает ошибку, которую вы имеете, и результаты, которые вы ожидаете. – millimoose

ответ

0

перебрать «большой словарь» вам нужна конструкция цикла:

>>> dict1={'a':[1,2,3,4,5], 'b':[6,7,8,9], etc} 
>>> (key,value), = dict1.items() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: too many values to unpack 
>>> for k,v in dict1.items(): 
... print k,v 
... 
a [1, 2, 3, 4, 5] 
b [6, 7, 8, 9] 
etc 

Конструкцию вы здесь:

(key,value),=dict1.items() 

Не делать то, что вы думаете.

Python поддерживает назначение кортежей. Номер на левой стороне должен совпадать с номером на стороне правой руки:

x,y=1,2 

(для Python 3, который имеет прекрасный * для LH заданий, кроме):

first, second, *the_rest=[1,2,3,4,5,6,7] 

Запятая в (key,value), неоднозначно в этом контексте в Py2 или Py3.

Вы использовать Запятая построить кортеж с одним элементом:

>>> 1, 
(1,) 
>>> 1,2, 
(1, 2) 

С более чем из одного элемента, он игнорируется.

С добавлением скобок на LH затем завершающая запятая, вы создаете вложенную кортеж:

>>> (1,2), 
((1, 2),) 

Единственный способ можно назначить такого зверя, чтобы соответствовать вложенности на RH:

>>> (x,y),z=((1,2),3) 
>>> x,y,z 
(1, 2, 3) 

без использования скобки, чтобы создать кортеж явно в Python, вы должны быть осторожны с order of operations:

>>> (1,2)==1,2 
(False, 2) 
# probably not what is expected here... 

Вы может это сделать:

>>> dict1={'a':[1,2,3,4,5], 'b':[6,7,8,9]} 
>>> keys, values=dict1.keys(), dict1.values() 
>>> keys 
['a', 'b'] 
>>> values 
[[1, 2, 3, 4, 5], [6, 7, 8, 9]] 

И вы можете построить Dict из этих двух списков ключей/значений, используя почтовый индекс:

>>> dict(zip(keys,values)) 
{'a': [1, 2, 3, 4, 5], 'b': [6, 7, 8, 9]} 
3

Вы немного расплывчаты, но есть две вещи, которые, я думаю, вы запрашиваете:

как сохранить все ключи в переменной и все значения в переменной:

values = dict1.values() 
keys = dict1.keys() 

или, более вероятно, таким образом, вы хотите, чтобы иметь возможность использовать это легко перебрать словарь:

for key,value in dict1.iteritems(): 
    print k,v 
2

Нет, первое предположение неверно. Учитывая dict1:

>>> dict1 = {'a': ['b', 'c']} 
>>> dict1.items() 
[('a', ['b', 'c'])] 

Таким образом, результат items список. Как вы знаете, Python имеет (в определенной степени) деструктурирующие назначение:

>>> a, b = ['hello', 'world'] 
>>> a 
'hello' 
>>> b 
'world' 

Он использует синтаксис кортежей, и, как вы знаете, чтобы сделать 1-кортеж, вы используете Запятая:

>>> a, = ['hello'] 
>>> a 
'hello' 

Что произойдет, если вы попытаетесь распаковать что-то с неправильным количеством значений?

>>> a, = ['hello', 'world'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: too many values to unpack (expected 1) 

Упс! Мы получаем ошибку. Таким образом, ваша проблема не имела слишком большого количества значений для каждого ключа; это было , имеющее более одного ключа.

Если вы хотите ключи и значения отдельно, используйте соответствующие dict методы:

>>> dict2 = {'a': ['b', 'c'], 'd': ['e', 'f', 'g', 'h']} 
>>> dict2.keys() 
['a', 'd'] 
>>> dict2.values() 
[['b', 'c'], ['e', 'f', 'g', 'h']] 
+1

Обратите внимание, что 'dict2.keys()' и 'dict2.values ​​()' _is гарантировано_, чтобы пересечь dict в том же порядке, если вы не изменяете его между ними. –

Смежные вопросы