Я хотел бы иметь возможность сделать словарь 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 (или таким образом, я думал, пока я не столкнулся с этой проблемой.)
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
Попробуйте:
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
Я думаю, что 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)
Когда вы говорите 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():
нужно.
Проблема заключается в следующем:
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 ():