Словарь Python, который отображает строки на ряд строк?

Я хотел бы иметь возможность сделать словарь Python со строками как ключи и наборы строк как значения. Например: { "crackers" : ["crunchy", "salty"] } Это должен быть набор, не список.

Однако, когда я пробую следующее:

  word_dict = dict()
  word_dict["foo"] = set()
  word_dict["foo"] = word_dict["foo"].add("baz")                                    
  word_dict["foo"] = word_dict["foo"].add("bang")

Я добираюсь:

Traceback (most recent call last):
  File "process_input.py", line 56, in <module>
    test()
  File "process_input.py", line 51, in test
    word_dict["foo"] = word_dict["foo"].add("bang")
AttributeError: 'NoneType' object has no attribute 'add'

Если я делаю это:

  word_dict = dict()
  myset = set()
  myset.add("bar")
  word_dict["foo"] = myset
  myset.add("bang")
  word_dict["foo"] = myset

  for key, value in word_dict:                                                       
      print key,                                                                
      print value

Я добираюсь:

Traceback (most recent call last):
  File "process_input.py", line 61, in <module>
    test()
  File "process_input.py", line 58, in test
    for key, value in word_dict:
ValueError: too many values to unpack

Какие-либо подсказки относительно того, как принудить Python в выполнение, что я хотел бы? Я - промежуточный пользователь Python (или таким образом, я думал, пока я не столкнулся с этой проблемой.)

15
задан Ellie P. 18 February 2010 в 02:20
поделиться

5 ответов

set.add () не возвращает новый набор , он изменяет набор , который он вызывает. Используйте его так:

word_dict = dict()
word_dict["foo"] = set()
word_dict["foo"].add("baz")                                    
word_dict["foo"].add("bang")

Кроме того, если вы используете цикл for для перебора словаря, вы перебираете ключи:

for key in word_dict:
   print key, word_dict[key]

В качестве альтернативы вы можете перебирать word_dict.items ( ) или word_dict.iteritems () :

for key, value in word_dict.items():
   print key, value
28
ответ дан 1 December 2019 в 00:00
поделиться

Попробуйте:

word_dict = dict()
myset = set()
myset.add("bar")
word_dict["foo"] = myset
myset.add("bang")
word_dict["foo"] = myset

for key in word_dict:                                                       
    print key, word_dict[key]

Похоже, стандартный итератор словаря возвращает только ключ , но не кортеж.

Доказательство:

>>> d = { 'test': 1 }
>>> for k, v in d: print k, v
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> for k in d: print d[k]
... 
1
1
ответ дан 1 December 2019 в 00:00
поделиться

Я думаю, что SetWindowLeyPtr должен сделать это. Обратите внимание на то, что после изменения стиля границы необходимо вызвать SetWindowPos .

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

-121--2970240-

Существует также класс символов POSIX xdigit (см. perlreref ):

/^[[:xdigit:]]{32}$/
-121--3206528-
from collections import defaultdict

word_dict = defaultdict(set)
word_dict['banana'].add('yellow')
word_dict['banana'].add('brown')
word_dict['apple'].add('red')
word_dict['apple'].add('green')
for key,values in word_dict.iteritems():
    print "%s: %s" % (key, values)
26
ответ дан 1 December 2019 в 00:00
поделиться

Когда вы говорите word_dict["foo"].add("baz"), вы добавляете 'baz' в набор word_dict["foo"].

Функция возвращает None - обновление множества является побочным эффектом. Поэтому

word_dict["foo"] = word_dict["foo"].add("baz") 

в конечном итоге устанавливает word_dict["foo"] в None.

Просто word_dict["foo"].add("baz") было бы правильно.

Во втором сценарии, когда вы говорите

for key, value in word_dict:                                                       

вы сталкиваетесь с ошибкой, потому что правильный синтаксис -

for key in word_dict: 

перебрать только ключи в word_dict. В этой ситуации вместо

for key,value in word_dict.iteritems(): 

нужно.

6
ответ дан 1 December 2019 в 00:00
поделиться

Проблема заключается в следующем:

word_dict["foo"] = word_dict["foo"].add("baz")   

Когда вы вызываете word_dict ["foo"]. Add ("baz") , вы изменяют набор, на который ссылается word_dict ["foo"] , и эта операция возвращает None . Итак, читая ваш оператор справа налево, вы добавляете «baz» к набору, на который ссылается word_dict [«foo»] , а затем устанавливаете результат этой операции (то есть None ) на word_dict ["foo"] .

Итак, чтобы все работало так, как вы ожидаете, просто удалите word_dict ["foo"] = из своего оператора.

Словари по умолчанию выполняют итерацию по своим ключам, отсюда ValueError, который вы попробуете:

for key, value in word_dict: 

Итерация по word_dict возвращает только ключ (скажем, «foo»), который вы затем пытаетесь распаковать. в переменные ключ и значение . Распаковка «foo» дает вам «f», «o», & «o», что на одно значение слишком много, чтобы поместиться в две переменные, и, следовательно, вашу ValueError.

Как утверждали другие, вам нужно выполнить итерацию по парам "ключ-значение" словаря, например:

for key, value in word_dict.iteritems (): 
1
ответ дан 1 December 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: