代码之家  ›  专栏  ›  技术社区  ›  Priyank Bolia

Python中有元组数据结构吗

  •  5
  • Priyank Bolia  · 技术社区  · 16 年前

    我希望有一个3项组合,如标记、名称和值列表(数组)存储这些内容的最佳数据结构。

    目前我正在使用字典,但它只允许2个项目,但很容易遍历使用

    for k, v in dict.iteritems():
    

    for k, v, x in tuple.iteritems():
    
    5 回复  |  直到 16 年前
        1
  •  8
  •   Kimvais    16 年前

    Python tutorial on data structutres 见第5.3节“元组和序列”

    但是,如果您想使用“name”来索引数据,您可能需要使用一个字典,该字典将字符串名称作为键,并且值是(tag、[list,of,value])的元组,例如。

      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"]

        2
  •  4
  •   Daren Thomas    16 年前

    为什么不使用元组列表(是的,这是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
    
        3
  •  4
  •   Community Mohan Dere    5 年前

    你可以考虑 collections.namedtuple 键入以创建类似元组的对象,这些对象具有可由属性查找访问的字段。

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

    __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
  •  2
  •   Community Mohan Dere    8 年前

    @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])]
    
        5
  •  0
  •   Roy Tang    16 年前

    可以有一个3项元组数组。

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