理解Python中的[foo for bar,foo in arr]

2024-04-16 04:03:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个元组列表,比如[(4, 'c'), (5, 'o'), (6, 'd')]。我试图更好地只提取我需要的数据。我现在可以用for循环或者用zip解包,但是我正在寻找其他方法来扩展我的知识

我已经在几个地方看到了下面的代码,这些代码提取了元组的第二个索引

letters = [ foo for bar, foo in arr ] 

这是怎么回事?如果我想提取第一个索引,这可能吗


Tags: 数据方法代码in列表forfoo地方
3条回答
arr = [(4, 'c'), (5, 'o'), (6, 'd')]
letters = [ bar for bar, foo in arr ] #  it will extract the first index

[.. for .. in ..]语法表示一个comprehension expression,特别是一个用于创建列表的[{}语法。理解通常与^{} statements类似,因为它们允许迭代,分配或解包每个元素,然后对每个元素进行操作

[ foo for bar, foo in arr ] 
#                     ^ iterable providing elements
#         ^ assignment of each element to name(s)
# ^ operation for each element

注意,中间赋值与赋值使用{{CD5>}的功率相同:

  • 将为单个名称目标分配整个值
    a = (1, 2)for a in [(1, 2), (3, 4)]
  • 将值的部分分配给多个名称目标
    a, b = (1, 2)for a, b in [(1, 2), (3, 4)]

这使得理解更方便,可以对元素进行解包并对每个部分进行单独操作,例如组合元素或丢弃一个元素

对每个元素的各个部分使用专有名称可以更清楚地了解发生了什么,以及如何更改结果:

>>> # code of the question, using proper names
>>> pairs = [(4, 'c'), (5, 'o'), (6, 'd')]
>>> [letter for number, letter in pairs]
['c', 'o', 'd']
>>> # desired result of the question
>>> [number for number, letter in pairs]
[4, 5, 6]

Comprehensions, especially for lists, are a feature found in many programming languages.它们源自一些人可能熟悉的数学“集合生成器符号”。例如,数学表达式“arr中的数字集”

{ number | (number, letter) ∈ arr}

直接转化为一套理解:

#      { number | (number, letter) ∈ arr}
# 
nums = {number for number, letter in arr}

您可以使用相同的方式提取第一个索引:

letters_first = [bar for bar, foo in arr]

这种速记技术在Python中称为"list comprehension"。一般语法是

[expression for variable in list] 

相关问题 更多 >