Python - 总结相同的数字

时间:2015-03-31 21:17:24

标签: python list duplicates

a = [2,2,2,3,4,5,5,6,6,6,7,7]
b = [1,2,3,4,5,6,7,8,9,10,11,12]

我想在' b'中加上数字。在' a'是相同的并删除' a'中的重复数字,因此输出应如下所示:

a = [2,3,4,5,6,7]
b = [6,4,5,13,27,23]

4 个答案:

答案 0 :(得分:1)

使用列表推导,将两个列表压缩在一起:

sums = [sum(y for x, y in zip(a, b) if x == i) for i in [j[0] for j in groupby(a)]]

答案 1 :(得分:0)

您可以使用izip_longestcollections.defaultdict这是解决此问题的快速而全面的方法,因为ab的长度不同:

>>> from collections import defaultdict
>>> from itertools import izip_longest
>>> d=defaultdict(int)

>>> for i,j in izip_longest(a,b):
...   d[i]+=j
... 
>>> d
defaultdict(<type 'int'>, {2: 6, 3: 4, 4: 5, 5: 13, 6: 27, 7: 23})
>>> d.values()
[6, 4, 5, 13, 27, 23]

但正如Padraic Cunningham所指出的那样,虽然在这种情况下答案是真的,但没有订购。

作为替代答案但效率较低,您可以使用itertools.groupby

>>> from itertools import izip_longest,groupby
>>> from operator import itemgetter
>>> [sum([i[1] for i in g]) for _,g in groupby(izip_longest(a,b),key=itemgetter(0))]
[6, 4, 5, 13, 27, 23]

答案 2 :(得分:0)

OrderedDict.fromkeys将在a中创建一组元素并保持顺序:

a = [2,2,2,3,4,5,5,6,6,6,7,7]
b = [1,2,3,4,5,6,7,8,9,10,11,12]

from collections import OrderedDict
from itertools import islice

od = OrderedDict.fromkeys(a,0,)

for ele in a:
    od[ele] += 1

it = iter(b)
sums = [sum(islice(it,v)) for v in od.values()]

print(list(od))
print(sums)
[2, 3, 4, 5, 6, 7]
[6, 4, 5, 13, 27, 23]

如果你使用套装,你将没有保证订单,也不清楚你的列表a中是否有重复的元素,如果是这样的话会发生什么。

使用以后的重复元素:

a = [2, 2, 2, 3, 4, 5, 5, 6, 6, 7, 6, 7, 7]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,13]

from collections import OrderedDict
from itertools import islice, count

it = iter(a)
seq = 1
prev = next(it)
cn = count()
od = OrderedDict()
for ele in it:
    if ele == prev:
        seq += 1
    else:
        od[next(cn)] = seq
        seq = 1
    prev = ele
if prev == ele:
    seq += 1
    od[next(cn)] = seq


st_a = OrderedDict.fromkeys(a)

it = iter(b)

sums = [sum(islice(it, v)) for v in od.values()]
print(list(st_a))
print(sums)
[0, 1, 2, 3, 4, 5, 6, 7]
[6, 4, 5, 13, 17, 10, 11, 25]

答案 3 :(得分:-1)

list(set(a))

应该满足第一部分。通过总结b中的simialar数字,不确定你的意思。似乎如果你这样做,那么b应该等于[6,3,4,10,18,14]。

编辑:(我还没有足够的代表发表评论,所以我会在这里提出我的问题。)所以看起来你正在总结索引?

编辑以澄清代码:将列表a转换为集合将删除所有重复项,然后列表转换回列表。我认为这就是OP所要求的。