假设我有以下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循环中是否有变量赋值。我真的很感激任何帮助!谢谢!
答案 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
,而只需一次。因此,此方法的好处随着D
或C
的大小增加而缩放。
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]