【问题标题】:Python list tuplesPython 列表元组
【发布时间】:2012-12-17 23:27:19
【问题描述】:

说,

data = { 123: 1, 234: 2, 241: 4 }
a = list(sorted(data.items()))

列表不是不必要的吗?我认为,sorted(data.items()) 本身会返回 listtuples 吗?为什么有人会专门使用列表功能?

【问题讨论】:

  • 在这种情况下是不必要的。那么问题是什么?

标签: python list dictionary tuples


【解决方案1】:

在这种情况下,list 调用是不必要的——你是对的。

一些 Python 方法返回迭代器而不是列表。 list 函数可用于强制迭代器成为列表(例如,以便对其进行索引)。

以函数reversed为例,它返回一个迭代器:

In [1]: type(reversed([3,1,2]))
Out[1]: listreverseiterator

In [2]: reversed([3,1,2])[1]
---------------------------------------------------------------------------
TypeError: 'listreverseiterator' object has no attribute '__getitem__'

我们可以使用list 来消费迭代器并在列表中使用它的结果:

In [3]: list(reversed([3,1,2]))[1]
Out[3]: 1

list 可用于强制其他类似列表的类型成为具体列表

In [4]: (1,2,3).append(4)
---------------------------------------------------------------------------
AttributeError: 'tuple' object has no attribute 'append'

In [5]: list((1,2,3)).append(4) # => [1, 2, 3, 4]

【讨论】:

  • +1。 OP 问题的关键可能是,无论sorted 是否返回一个列表,无论是谁写的都不是肯定的,而不是考虑它或只是在解释器中测试它,而是决定添加一个额外的list为了安全。
  • IIRC, sorted 在 Python 3 中返回一个生成器视图,因此在该上下文中调用 list 将其包装起来很有用。 (编辑:看来我错了:与许多其他函数不同,sorted 即使在 Python 3.3 中仍会返回一个列表)
【解决方案2】:

是的,sorted 本身返回一个 list。因此,在 list 数据结构上调用 list() 是没有用的。在其上调用list() 等价于sorted(data.items())[:]

In [7]: print sorted.__doc__
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

In [8]: lis=[1,2,3]

In [9]: lis
Out[9]: [1, 2, 3]

In [10]: list(lis)    #same result, but different object. (A shallow copy)
Out[10]: [1, 2, 3]

如果您想获取iterator 的所有值,list() 会很有用:

In [11]: y=xrange(5)

In [12]: y
Out[12]: xrange(5)

In [13]: list(y)
Out[13]: [0, 1, 2, 3, 4]

【讨论】:

    【解决方案3】:

    是的,在这种情况下没有必要:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 2017-12-06
      • 2018-02-25
      • 2014-07-04
      • 1970-01-01
      • 2011-07-27
      • 2017-11-28
      • 1970-01-01
      相关资源
      最近更新 更多