在python中列出具有变量赋值的理解

时间:2018-01-12 13:36:41

标签: python for-loop list-comprehension

假设我有以下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循环中是否有变量赋值。我真的很感激任何帮助!谢谢!

3 个答案:

答案 0 :(得分:8)

反向加工。

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

所以没有测试,我可以写:

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

这个解决方案可能更复杂,而不是简单列表理解但它也更有效(O(n)而不是O(n 2 ))。原因是,对于我们从D获得的每个项目e,我们不再需要查看整个列表C,而只需一次。因此,此方法的好处随着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]