gpt4 book ai didi

python - 如何在 python 中的列表理解中编写以下内容

转载 作者:太空宇宙 更新时间:2023-11-04 09:00:04 25 4
gpt4 key购买 nike

我可以在 python 中以列表理解的方式编写以下内容吗

for row in candidates:
sum=0
for i in range(1,len(candidates)):
if(row[i]!='NA')
sum+=int(row[i])
row.append(sum)

这里的 candidates 是候选列表的列表,其中每个内部列表都包含候选标记。我想做的是

“我在每个内部列表中增加一个成员,它将保留每个候选人的总分”像candidate=[[143050023,5,7,6,8],[14305678,3,4,5,6]](里面的0索引有候选人的roll number)

我想要的答案是

[[143050023,5,7,6,8,26],[14305678,3,4,5,6,18]]

我可以在不使用列表理解的情况下做同样的事情,但在尝试使用列表理解时遇到困难我在写作中面临的困难是如何对值求和并将其附加到每个内循环之后的行。

与普通的 for 循环结构相比,何时使用列表理解更好?

最佳答案

让我们从最后一个问题开始:

When using a list comprehension is better as compared to the normal for loop structure?

必须满足两点:

  • 循环的目的是构建一个列表。
  • 它作为理解比作为显式循环更具可读性。

请注意,您有两个嵌套循环。这可能可以转换为带有两个for 子句的理解,或者转换为嵌套理解,但它不会转换为单一的平面理解。

你的内部循环有一个问题:理解不应该尝试改变任何东西,并且不能用赋值或其他语句改变任何东西。因此,您需要找到一种方法来重写它,使其以不变的方式工作。

在这种情况下,显而易见的答案是创建要求和的值,然后将生成的可迭代对象传递给对它们求和的函数,例如内置的 sum 函数:

sum(int(row[i]) for i in range(1, len(row)) if row[i] != 'NA')

我使用生成器表达式而不是列表推导式,因为除了循环遍历之外,我们实际上不需要列表。

请注意,您可以进一步简化它。您唯一使用 i 的是在(重复的)表达式 row[i] 中。那么,既然可以直接遍历行,为什么还要遍历索引范围呢?

sum(int(value) for value in row if value != 'NA')

你的外层循环有一个类似的问题:你试图改变循环内的每个 row,而不是建立一个新的结构。而且很难想出一个好的替代方案来通过构建一个新结构来完成同样的事情。

当然,您总是可以分两次完成操作:

sums = [sum(int(row[i]) for i in range(1, len(candidates)) if row[i] != 'NA')
for row in candidates]
candidates[:] = [row + [sum] for row, sum in zip(candidates, sums)]

并且您可以通过再次将 sums 更改为生成器表达式而不是列表理解来将这两个过程合并为一个过程,您甚至可以通过就地执行将其变成单行代码而不是使用命名的临时变量:

candidates[:] = [row + [total] for row, total in zip(candidates, (sum(
int(row[i]) for i in range(1, len(candidates)) if row[i] != 'NA')
for row in candidates))]

但很难说它比您的原始版本更具可读性,甚至更接近于可读性。

另外,请注意,我将保存每个总和的变量称为 total,而不是 sumsum 函数是 Python 中一个非常重要的内置函数(也是我们在这个答案中实际使用的函数),因此通过创建同名变量来隐藏它不是一个好主意。即使在这种情况下,它只在不使用内置函数的列表理解范围内有效,所以它对解释器来说不是模棱两可的,但对人类读者来说仍然是模棱两可和令人困惑的。 (感谢 Padraic Cunningham 指出这一点。)

关于python - 如何在 python 中的列表理解中编写以下内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26305670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com