鉴于这两个清单
L2 = [A,B,C,D,A,B]
L3 = [3,2,1,2,2,1]
我想获得
L2_WANTED = [A,B,C,D]
L3_WANTED = [5,3,1,2]
列表总是有序且大小相同,元素对应作为键值对,例如A:3,B:2等等。
目标是消除L2中的重复并将L3中的相应项相加以获得具有匹配对的新列表。这是为了在项目添加到列表时保留正在运行的项目列表。
我尝试用index
编写一个函数,但它开始变得难看。我查了itertools
但找不到任何相关内容;我查看了starmap()
但无法使其正常工作。也许这可以通过列表理解来完成。我很感激有关如何实现这种最简单方法的任何线索或方向。谢谢。
修改
@SimonC:
>>> l2_sum = {}
>>> for i in range(0, len(L2)):
key = L2[i]
num = L3[i]
l2_sum[key] = l2_sum.get(key, 0) + num
>>> l2_sum
{'A': 5, 'C': 1, 'B': 3, 'D': 2}
>>>
这如何消除欺骗并添加数字?你能给出一个线索吗?谢谢。
答案 0 :(得分:2)
我相信那里会有更优雅的答案,并会在回复中提及。
但是对于一些简单的答案:
L2 = ['A','B','C','D','A','B']
L3 = [3,2,1,2,2,1]
L4 = zip(L2, L3)
L5 = []
L6 = []
def freduce(l):
for x, y in l:
print x , y
if x in L5:
k = L5.index(x)
L6[k] += y
else:
L5.append(x)
L6.append(y)
freduce(L4)
print L5
print L6
输出:
['A', 'B', 'C', 'D']
[5, 3, 1, 2]
[理解第二次实施的编辑答案]
>>> L3 = [3,2,1,2,2,1]
>>> L2 = ['A','B','C','D','A','B']
>>> range(0, len(L2))
[0, 1, 2, 3, 4, 5]
>>>
因此,对于范围内的i(0,len(L2)):... i成为索引
使用此索引,您可以通过执行以下操作从L3和L2中提取信息:
key = L2[i]
num = L3[i]
然后您将信息添加到词典
l2_sum[key] = l2_sum.get(key, 0) + num
这里l2_sum.get(key,0)如果键不存在则返回0,否则返回当前值。
我希望它足够清楚。
答案 1 :(得分:2)
我认为使用zip
是组合列表的好方法。 dict.update
部分将进行求和,因为我获取前一个值并更新它:
foo = dict()
for x, y in zip(['A', 'B', 'C', 'D', 'A', 'B'],
[3, 2, 1, 2, 2, 1]):
foo[x] = y + foo.get(x, 0)
print foo
输出:
{'A': 5, 'C': 1, 'B': 3, 'D': 2}
编辑:
虽然以上情况很好,但我也考虑使用itertools.izip,它允许您在构建字典时执行zip
。这样你就可以节省内存。您需要做的就是在导入zip
后将itertools.izip
替换为iterools
答案 2 :(得分:1)
这样做,但根据pyfunc,有更好的方法:
l2_sum = {}
for i in range(0,len(L2)):
key = L2[i]
num = L3[i]
l2_sum[key] = l2_sum.get(key, 0) + num
L2_WANTED = sorted(l2_sum.keys())
L3_WANTED = [l2_sum[key] for key in L2_WANTED]