1

鉴于这两个列表

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()但无法让它工作。可能这也可以通过列表理解来完成。我将不胜感激有关如何实现这种最简单方法的任何线索或方向。谢谢你。

编辑

@西蒙C:

>>> 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}
>>>

这如何消除欺骗并添加数字?你能给个线索吗?谢谢。

4

3 回答 3

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]
>>> 

因此 in for i in range(0, len(L2)): ... i 成为索引

使用此索引,您可以通过执行以下操作从 L3 和 L2 中提取信息:

key = L2[i]
num = L3[i]

然后你将信息添加到 dict

l2_sum[key] = l2_sum.get(key, 0) + num

这里 l2_sum.get(key, 0) 如果键不存在则返回 0,否则返回当前值。

我希望它足够清楚。

于 2010-11-03T05:25:36.560 回答
2

我认为 usingzip是组合列表的好方法。该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构建字典时执行此操作。这样你就可以节省内存。您需要做的就是在导入后替换zipitertools.izipiterools

于 2010-11-04T01:01:12.440 回答
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]
于 2010-11-03T05:28:22.580 回答