Есть ли в Python структура данных кортежа - PullRequest
5 голосов
/ 02 декабря 2009

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

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

for k, v in dict.iteritems():

можем ли мы иметь что-то похожее на:

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

Ответы [ 5 ]

8 голосов
/ 02 декабря 2009

Учебник Python по структурам данных см. Раздел 5.3 "Кортежи и последовательности"

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

  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"] будет работать, как и для любого другого словаря.

4 голосов
/ 02 декабря 2009

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

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

Возвращает новый подкласс кортежа с именем typename. Новый подкласс используется для создания объектов, похожих на кортежи, которые имеют поля, доступные для поиска по атрибутам, а также индексируемые и итерируемые. Экземпляры подкласса также имеют полезную строку документации (с typename и field_names) и полезный метод __repr__(), который перечисляет содержимое кортежа в формате имя = значение.

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

4 голосов
/ 02 декабря 2009

почему бы просто не использовать список кортежей (да, это тип данных в 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
1 голос
/ 03 декабря 2009

Вот комментарий @ 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 голосов
/ 02 декабря 2009

Вы можете иметь массив из трех элементов.

arr = [ (1,2,3), (4,5,6), (7,8,9)]
for (k, v, x) in arr:
  # do stuff
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...