繁体   English   中英

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

[英]How to write the following in list comprehension in python

我可以在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)

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

“我正在增加每个内部列表中的成员,这将保留每个候选人的总分”,例如candidate=[[143050023,5,7,6,8],[14305678,3,4,5,6]] (0内部的索引具有候选的滚动编号)

我想作为

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

我可以在不使用列表推导的情况下执行相同的操作,但是在尝试使用列表推导时会遇到困难。我在编写时面临的困难是如何对值求和并将其附加到每个内部循环之后的行中。

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

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

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

必须做两件事:

  • 循环的目的是建立一个列表。
  • 作为一种理解,它比作为一个显式循环更易读。

注意,您有两个嵌套循环。 可能可以转换为具有两个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))]

但是,很难说它比原始版本更具可读性,甚至与可读性几乎接近。

另外,请注意,我调用了一个变量,该变量保存每个sum total ,而不是sum sum函数是Python中一个非常重要的内置函数(我们在此答案中实际上正在使用一个函数),因此通过创建同名变量来隐藏它是一个坏主意。 即使在这种情况下,它仅存在于不使用内置函数的列表理解范围内,因此它对于解释器而言并不歧义,但对于人类读者而言仍然是歧义且令人困惑。 (感谢Padraic Cunningham指出了这一点。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM