2009-12-02 2 views
4

Я хочу иметь комбинацию из 3 элементов, таких как тег, имя и список значений (массив), что является наилучшей возможной структурой данных для хранения таких вещей.Есть ли структура данных кортежа в Python

Current Я использую словарь, но он позволяет только 2 пунктов, но легко обход с помощью

for k, v in dict.iteritems(): 

мы можем иметь что-то подобное, как:

for k, v, x in tuple.iteritems(): 
+2

почему это время downvoted? – blank

+5

Вопрос заголовка вводит в заблуждение; ответ на вопрос в названии просто «да». Тело вопроса фактически запрашивает лучшую структуру для хранения некоторых данных, что является другим вопросом. –

+0

-1: «наилучший вариант» не имеет смысла. Задайте вопрос, на который можно ответить. Лучше с какой целью? Скорость? Место хранения? Сложность кода? Какие? –

ответ

3

Вы можете рассмотреть collections.namedtuple типа для создания кортежа, как объектов, которые имеют поле, доступное по атрибуту поиск.

collections.namedtuple(typename, field_names[, verbose])

Returns a new tuple subclass named typename. The new subclass is used to create tuple-like objects that have fields accessible by attribute lookup as well as being indexable and iterable. Instances of the subclass also have a helpful docstring (with typename and field_names) and a helpful __repr__() method which lists the tuple contents in a name=value format.

>>> import collections 
>>> mytup = collections.namedtuple('mytup', ['tag','name', 'values']) 
>>> e1 = mytup('tag1','great',[1,'two',3]) 
>>> e1 
mytup(tag='tag1', name='great', values=[1, 'two', 3]) 
>>> e1.values 
[1, 'two', 3] 
>>> 

Опираясь на другие ответы, пример фильтрации списка mytup объектов:

>>> tlist = [mytup("foo", "dog", [1,2,3,4]), 
    mytup("bar","cat", [4,5,6,7,8,9]), mytup("moo","cow", [4,5,7,8,9,1,3,4,65])] 
>>> tlist 
[mytup(tag='foo', name='dog', values=[1, 2, 3, 4]), 
mytup(tag='bar', name='cat', values=[4, 5, 6, 7, 8, 9]), 
mytup(tag='moo', name='cow', values=[4, 5, 7, 8, 9, 1, 3, 4, 65])] 
>>> [t for t in tlist if t.tag == 'bar'] 
[mytup(tag='bar', name='cat', values=[4, 5, 6, 7, 8, 9])] 
>>> 

Namedtuple объекты могут, конечно, можно использовать и в других структурах (например, dict), как упоминалось в других ответах. Преимущество, очевидно, состоит в том, что поля являются с именем, а код с их использованием более ясен.

+0

И как вы создаете массив этих namedtuple, чтобы пройти легко. Прошу прощения, вчера только начал Python только для написания скрипта Python. –

+0

Добавлен пример фильтрации. – gimel

+1

'tlist = map (mytup, [(" foo "," dog ", [1,2]), (" bar "," cat ", [3,4]),])' – jfs

4

почему бы не просто использовать список кортежей (да, это тип данных в Python, как списки, но неизменны):

mylistoftuples = [(1, 2, 3), (2, "three", 4), (3, 4, [1, 2, 3, 4, 5])] 
for k, v, x in mylistoftuples: 
    print k, v, x 
+2

Для полноты, отметим, что это плохо работает в отделе поиска предметов. –

+1

Согласен. См. Кимваа ниже для решения этого. –

0

Вы можете иметь массив 3-я t кортежей.

arr = [ (1,2,3), (4,5,6), (7,8,9)] 
for (k, v, x) in arr: 
    # do stuff 
8

Python tutorial on data structutres см раздел 5.3 «кортежи и последовательности»

Однако, если вы хотите использовать «имя» для индексирования данных, вы, вероятно, хотите использовать словарь, который имеет имя строки в качестве ключа и значения являются кортежем (тег, [список, из, значения]), например

d = 
    { "foo" : ("dog", [1,2,3,4]), 
     "bar" : ("cat", [4,5,6,7,8,9]), 
     "moo" : ("cow", [4,5,7,8,9,1,3,4,65]) 
    } 

    for name,(tag,values) in d.items(): 
    do_something() 

этот путь также d["foo"] будет работать, так же как и для любого другого словаря.

+0

Это лучший ответ, чем выбранный - он прямо показывает решение поставленного вопроса. – PaulMcG

3

Может быть, вы должны посмотреть здесь: Python data structures

+2

+1 Python учебник rulez. Это одно из лучших представлений о языках программирования, которые я видел, если не самое лучшее.Задавая любые вопросы о Python перед чтением, это ... Я не знаю ... –

1

Вот комментарий к @gimel's answer:

>>> import collections 
>>> T = collections.namedtuple("T", 'tag name values') 
>>> from itertools import starmap 
>>> list(starmap(T, [("a", "b", [1,2]), ("c", "d",[3,4])])) 
[T(tag='a', name='b', values=[1, 2]), T(tag='c', name='d', values=[3, 4])] 
+0

работает хорошо и коротко, чтобы писать, но почему-то я предпочитаю метод gimel, который выглядит более чистым для чтения, хотя гораздо более типизированным. –

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