2015-02-09 6 views
1

Я пытаюсь создать словарь python, и я хотел бы использовать ключ, содержащий строки, численные & запись в список/кортеж. Ключ должен идеально выглядетьПередача Строка, целочисленная и кортежная информация как ключ для словаря python

("stringA", "stringB", "stringC", integer1, (integer2, integer3, integer4)) 

Я попытался создать namedtuple на основе этого documentation следующим

from collections import namedtuple 
dictKey = namedtuple('dictKey', 'stringA stringB stringC integer1 
         (integer2 integer3 integer4)') 

но он бросает меня ValueError говоря, он может содержать только буквенно-цифровые символы и знаки подчеркивания. Таким образом,

  1. Как создать ключ словаря, который содержит кортеж?

  2. Как эффективно использовать ключ словаря (особенно, он содержит ) для извлечения информации из словаря?

+0

Вы можете использовать кортеж элементов в качестве ключа точно так же, как вы разместили, единственная ошибка: namedtuple –

+0

To downvoter. Пожалуйста, предлагайте улучшения или нарушения, когда вы используете downvote, поскольку я думаю, что это поможет всем нам. – WanderingMind

ответ

2

Проблема здесь с namedtuple определения, а не словарной ключевой структуры самой, которая будет работать нормально, например:

>>> d = {} 
>>> d[('1', '2', 3, (4, 5))] = 'foo' 
>>> d 
{('1', '2', 3, (4, 5)): 'foo'} 

Когда namedtuple считывает параметр field_names, он считает, что вы» re пытается создать поле с именем и не понимает, что вы имеете в виду его вложенный tuple.

Чтобы определить эту структуру в namedtuple, вы вместо того, чтобы иметь атрибут, который сам по себе является tuple:

>>> from collections import namedtuple 
>>> dictKey = namedtuple("dictKey", "stringA stringB stringC integer1 tuple1") 
>>> key = dictKey("foo", "bar", "baz", 1, (2, 3, 4)) 
>>> d[key] = 'bar' 
>>> d 
{dictKey(stringA='foo', stringB='bar', stringC='baz', integer1=1, tuple1=(2, 3, 4)): 'bar', 
('1', '2', 3, (4, 5)): 'foo'} 

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

>>> d[key] 
'bar' 

или новый:

>>> d[dictKey("foo", "bar", "baz", 1, (2, 3, 4))] 
'bar' 
+0

Спасибо. Можете ли вы также ответить на часть вопроса о получении информации, и я могу принять ответ. – WanderingMind

+0

@WanderingMind, что вы имеете в виду? Когда у вас есть ключ, вы можете использовать его, как и любой другой. Я добавил несколько строк, дайте мне знать, если это более подробно ответит на вопрос. – jonrsharpe

+0

Например, как я могу получить все словарные статьи, соответствующие словам tuple1 [1] = 3 – WanderingMind