【问题标题】:List comprehension in python with variable assignmentpython中的列表理解与变量赋值
【发布时间】:2018-01-12 13:36:40
【问题描述】:

假设我有以下for循环

L=[]
for e in C:
    t=0
    for r in D:
        if r[0]==e:
            t=t+r[2]
    L.append((e,t))

为了提供更多信息,e 是一个列表,r 是一个大小为 3 的元组。我还希望 L 的每个元素都包含一个元组。

如何在列表理解中编写以下内容?我不确定 for 循环中有变量赋值。我真的很感激任何帮助!谢谢!!

【问题讨论】:

    标签: python for-loop list-comprehension


    【解决方案1】:

    反过来做。

    要附加到 L 的数据是什么? tuple。 这个元组是由什么组成的? e(我们有)和给定条件的一些条款的总和。

    所以不用测试我也可以写:

    L = [(e,sum(r[2] for r in D if r[0]==e)) for e in C]
    

    【讨论】:

    • 必须有一个更好的答案,它不会遍历 D len(C) 次,而只会遍历一次。如果我们只想将 OP 的循环转换为 1-1 的理解,没有比这更好的了。
    • 是的,你可能是对的,但如果没有进一步的测试数据,很难看出这一点。它可能会涉及生成某种字典来保存内部循环。
    • 无论如何,我会为我未来的培训课程保留这个问答:) 一个复杂循环变成......复杂列表理解的好例子 :)
    • @Ev.Kounis 为避免重新遍历必须先建立 D 的索引,以便过滤变成字典中的微不足道的键查找。
    【解决方案2】:
    L = [
        (
            e,
            (sum(r[2] for r in D if r[0]==e))
        )
        for e in C
    ]
    

    【讨论】:

    • sum 周围的括号有问题...
    • 不是反对者,而是sum(r[2]) 这不可能是正确的
    • 糟糕,已修复。上面的答案第一次就对了:)
    【解决方案3】:

    这个解决方案可能更复杂,而不是简单的列表理解,但它也更有效(O(n) 而不是 O(n2 ))。原因是我们不再需要遍历整个列表D 来处理我们从C 获得的每一项e,而只需一次。因此,这种方法的好处随着DC 的大小增加而扩大。

    from operator import itemgetter
    from itertools import groupby
    
    D = [["A", 0], ["B", 1], ["C", 0], ["D", 2], ["A", 2]]
    D.sort(key=itemgetter(0))
    
    glo = {k: sum(f[1] for f in g) for k, g in groupby(D, key=itemgetter(0))}
    
    L = [(e, glo[e]) for e in C]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 2022-11-28
      • 2019-04-15
      相关资源
      最近更新 更多