【问题标题】:Don't understand the syntax of list comprehension不理解列表推导的语法
【发布时间】:2021-07-16 11:14:18
【问题描述】:

我不明白列表理解的语法:

newList = [expression(element) for element in oldList if condition]

我不明白的是(element)。假设您有以下代码:

List = [character for character in 'Hello world!'] 
print(list)

然后你会得到:

['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

由于第一个character 不是一个表达式,它在做什么?这是否只是意味着字符串中的每个项目都存储在一个新列表中?

【问题讨论】:

  • 您可以查看Python List Comprehension, How To? 以了解理解的工作原理。
  • 但是character 一个表达式。而且,是的,列表理解正在创建一个新列表。
  • 你不应该使用 List 作为变量名,因为它是一个保留关键字尝试使用 my_list 来避免问题

标签: python syntax list-comprehension


【解决方案1】:

Python list comprehensions 用于在列表中执行循环以生成新列表。python 列表推导式从或右到左 向后 评估的原因通常是括号内的任何内容([], {}, () ) 在 python 中是从 right to left 执行的,只有几个例外。另外需要注意的是字符串是可迭代的 (lists,tuples , sets, dictionaries, numpy 数组)连接字符,以便可以像列表一样对其进行迭代。

列表理解形式:

new_list = [item for item in my_list]

这将产生相同的效果:

for item in my_list:
    my_list.append(item)

由于字符串是可迭代的字符,您可以这样做:

my_list = [character for character in 'Hello world!'] 
print(list)

输出:

['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

你的列表理解也可以写成:

my_list = []
for character in 'Hello world':
    my_list.append(character)

print(my_list)

我还指出,您不应该使用内置方法(例如List)作为变量名,因为当您覆盖它们时,您将无法在将来使用该方法。

以下是从 python 3.9.6 开始的所有 builins 的完整列表:

【讨论】:

    【解决方案2】:

    让我们通过几个示例来了解 Python 列表理解的语法。参考完成documentation

    基本用法:[<expression> for <item> in <iterable>]。在python中,任何实现__next__()方法的对象都是一个可迭代对象。

    例如,List 对象是可迭代的。考虑以下代码:

    list_a = [1, 2, 3]
    list_b = [item for item in list_a]     # [1, 2, 3]
    list_c = [item + 1 for item in list_a] # [2, 3, 4]
    list_d = [None for item in list_a]     # [None, None, None]
    

    有趣的是,String 对象也是可迭代的。所以当你遍历一个字符串时,每个项目都是一个字符。在您的示例中就是这种情况。

    现在,进入表达式。在 python 中,任何值(整数、浮点数、字符等)或任何对象都是表达式。澄清一下,表达式不包含等号。 This 是对“什么是 Python 中的表达式?”这个问题的绝佳回答。

    我注意到您使用(也在 cmets 中指出)list 作为变量的名称。有一些关键字和名称不应该在 Python 中用作变量名。您可以通过以下方式找到所有此类内置名称的列表:(refer this post for more details)

    import builtins
    dir(builtins)
    

    【讨论】:

    • 你喜欢抄袭别人的帖子和cmets,这太粗鲁了
    猜你喜欢
    • 1970-01-01
    • 2023-01-02
    • 2010-10-06
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2014-10-19
    相关资源
    最近更新 更多