2

我阅读了一些关于 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')]
4

3 回答 3

8

代码显式生成元组:

(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')]
于 2013-09-20T22:24:20.857 回答
2

在 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')]

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

于 2013-09-20T22:41:56.177 回答
1

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

于 2013-09-20T22:25:40.313 回答