【问题标题】:Python tuple instead of listPython 元组而不是列表
【发布时间】:2013-09-26 10:21:14
【问题描述】:

我阅读了一些关于 Python 的技巧并遇到了以下代码。我很困惑为什么代码会在列表中创建包含两个元素的元组。 为什么python返回列表中的元组而不是列表中的列表?它与元组不可变有关吗? 提前致谢。

>>>import os, glob
>>>[(os.stat(f).st_size, os.path.realpath(f)) for f in glob.glob('*.sh')]
[(3074, '/home/usr1/a.sh'),
(3386, '/home/usr1/b.sh'),
(3070, '/home/usr1/c.sh')]

【问题讨论】:

    标签: python list python-3.x tuples list-comprehension


    【解决方案1】:

    您在 Python 中通过用逗号分隔项目来创建一个元组:

    >>> 1,2,3
    (1, 2, 3)
    >>> x = 1,2,3
    >>> x
    (1, 2, 3)
    

    当像你一样使用列表推导式时,以及在其他情况下,你必须向 python 提示你正在尝试创建一个元组这一事实(而且它往往也有助于其他开发人员,这总是一个好事物)。正如Martijin 指出的那样——(os.stat(f).st_size, os.path.realpath(f)) 正在创建一个元组。

    >>>[(os.stat(f).st_size, os.path.realpath(f)) for f in glob.glob('*.sh')]
        ^                  ^.                   ^
        |                    \_ this makes      |
        \__________________     it a tuple      |
                           \____________________\___ These are how Python knows to
    that the comma makes it a tuple - they group that piece of code toegether.
    

    你可以在里面放任何你想要的东西......

    • 列出清单:[[os.stat(f).st_size, os.path.realpath(f)] for f in glob.glob('*.sh')]
    • 什么都不做呢? [None for f in glob.glob('*.sh')]
    • 让我们把文件名倒过来:[f[::1] for f in glob.glob('*.sh')]

    This 是一个非常高级的资源,它讨论了列表推导和生成器之类的内容,可能会很有趣。

    【讨论】:

      【解决方案2】:

      代码显式生成元组:

      (os.stat(f).st_size, os.path.realpath(f))
      

      对于生成的每个列表元素,这是一个 2 值元组。列表推导可以重写为:

      result = []
      for f in glob.glob('*.sh'):
          item = (os.stat(f).st_size, os.path.realpath(f))
          result.append(item)
      

      如果要生成嵌套列表,请将括号替换为方括号:

      [[os.stat(f).st_size, os.path.realpath(f)] for f in glob.glob('*.sh')]
      

      【讨论】:

      • 哦,我漏掉了括号。谢谢。
      • @Ugur,请注意,在某种程度上,tuple 实际上可能比列表更有意义,因为数据是异构的(不同的类型,不同的内容表示)。
      【解决方案3】:

      (a,b) 是一个元组。 [(a,b)] 是一个元组列表。

      【讨论】:

        猜你喜欢
        • 2013-06-13
        • 2014-03-06
        • 1970-01-01
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 2020-03-30
        • 2012-03-11
        相关资源
        最近更新 更多