【问题标题】:Is there a tuple data structure in PythonPython中有元组数据结构吗
【发布时间】:2009-12-02 07:36:01
【问题描述】:

我想要一个 3 项组合,例如标签、名称和值列表(数组),存储这些东西的最佳数据结构是什么。

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

for k, v in dict.iteritems():

我们可以有类似的东西吗:

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

【问题讨论】:

  • 问题标题具有误导性;标题中问题的答案只是“是”。问题的主体实际上要求存储一些数据的最佳结构,这是一个不同的问题。
  • -1:“最好的可能”是没有意义的。请提出一个可以回答的问题。最好用于什么目的?速度?贮存?代码复杂度?什么?
  • 有时最好是通用的,这意味着易用性、标准方式、复杂性,除非它们是显着的性能问题或速度问题。

标签: python tuples


【解决方案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])]

【讨论】:

  • 工作得很好,写起来很短,但不知何故,我更喜欢 gimel 方法,它看起来更干净,虽然打字更多。
【解决方案2】:

您可以考虑使用collections.namedtuple 类型来创建具有可通过属性查找访问的字段的类似元组的对象。

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

返回一个名为 typename 的新元组子类。新的子类用于创建类似元组的对象,这些对象具有可通过属性查找访问的字段以及可索引和可​​迭代的。子类的实例还有一个有用的文档字符串(带有 typename 和 field_names)和一个有用的 __repr__() 方法,它以 name=value 格式列出元组内容。

>>> 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),如其他答案中所述。显然,优点是字段被命名,使用它们的代码更清晰。

【讨论】:

  • 以及如何创建这些命名元组的数组以便轻松遍历。不好意思,昨天刚开始Python只是为了写一个Python脚本。
  • 添加列表过滤示例。
  • tlist = map(mytup, [("foo", "dog", [1,2]), ("bar", "cat", [3,4]),])
  • @J.F. Sebastian,这是错误的,不起作用:TypeError: __new__() 正好需要 4 个参数(给定 2 个)
  • @Priyank Bolia:正确。将map 替换为itertools.starmap。见stackoverflow.com/questions/1831218/…
【解决方案3】:

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

但是,如果您想使用“名称”来索引数据,您可能希望使用以字符串名称作为键且值是 (tag, [list, of, values]) 的元组的字典,例如

  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】:

为什么不只使用元组列表(是的,这是 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

【讨论】:

  • 为了完整起见,让我们注意这在项目查找部门失败了。
  • 我同意。有关该问题的解决方案,请参阅下面的 Kimvais。
【解决方案5】:

您可以拥有一个包含 3 项元组的数组。

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

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 2011-02-08
    • 2013-06-05
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多