Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在具有相等值的列表上求和和并聚合_Python_List - Fatal编程技术网

Python 在具有相等值的列表上求和和并聚合

Python 在具有相等值的列表上求和和并聚合,python,list,Python,List,我有一对长度相同的列表,第一个包含int值,第二个包含float值。我希望用另一对可能更短但长度相同的列表替换这些列表,其中第一个列表将只包含唯一值,第二个列表将包含每个匹配值的总和。也就是说,如果新对中第一个列表的第i个元素是x,并且出现x的原始对的第一个列表中的索引是i_1,…,i_k,那么新对中第二个列表的第i个元素应该包含索引i_1,。。。,i_k在原始对的第二个列表中 举例说明 输入: ([1, 2, 2, 1, 1, 3], [0.1, 0.2, 0.3, 0.4, 0.5, 1.0

我有一对长度相同的列表,第一个包含
int
值,第二个包含
float
值。我希望用另一对可能更短但长度相同的列表替换这些列表,其中第一个列表将只包含唯一值,第二个列表将包含每个匹配值的总和。也就是说,如果新对中第一个列表的第i个元素是
x
,并且出现
x
的原始对的第一个列表中的索引是
i_1,…,i_k
,那么新对中第二个列表的第i个元素应该包含索引
i_1,。。。,i_k
在原始对的第二个列表中

举例说明

输入:

([1, 2, 2, 1, 1, 3], [0.1, 0.2, 0.3, 0.4, 0.5, 1.0])
我们的建议:

([1, 2, 3], [1.0, 0.5, 1.0])

我试图在这里做一些列表理解技巧,但失败了。我可以为此编写一个愚蠢的循环函数,但我相信这里应该有更好的方法。

一种方法是使用
pandas

>>> import pandas as pd
>>> df = pd.DataFrame({'tag':[1, 2, 2, 1, 1, 3], 
                       'val':[0.1, 0.2, 0.3, 0.4, 0.5, 1.0]})
>>> df
   tag  val
0    1  0.1
1    2  0.2
2    2  0.3
3    1  0.4
4    1  0.5
5    3  1.0
>>> df.groupby('tag')['val'].aggregate('sum')
tag
1      1.0
2      0.5
3      1.0
Name: val, dtype: float64

使用以下键构建地图:

la,lb = ([1, 2, 2, 1, 1, 3], [0.1, 0.2, 0.3, 0.4, 0.5, 1.0])
m = {k:0.0 for k in la}
并将其填入总和:

for i in xrange(len(lb)):
    m[la[i]] += lb[i]
最后,从您的地图:

zip(*[(k,m[k]) for k in m]*1)

不是一行,但由于您尚未发布解决方案,我建议您使用以下解决方案:

当然,如果顺序不重要,那么最好使用:


在标题中正确表达这个问题非常困难,欢迎任何编辑。我们可以看看你愚蠢的循环函数吗?很好,但有点过火,不是吗?@Bach是的,这可能是过火,取决于你在做什么。我开始写它,但你更快了。。。事实上,这并不坏。您是否使用了OrderedDict,以便
具有相同的顺序?在
dict
中,这不是事实上的保证吗?@Bach是的,在正常的dict中也是保证的。但我认为顺序对于查看输出很重要,所以使用了
OrderedDict
>>> from collections import OrderedDict
>>> a, b = ([1, 2, 2, 1, 1, 3], [0.1, 0.2, 0.3, 0.4, 0.5, 1.0])
>>> d = OrderedDict()
>>> for k, v in zip(a, b):
...     d[k] = d.get(k, 0) + v
...     
>>> d.keys(), d.values()
([1, 2, 3], [1.0, 0.5, 1.0])
>>> from collections import defaultdict
>>> a, b = ([1, 'foo', 'foo', 1, 1, 3], [0.1, 0.2, 0.3, 0.4, 0.5, 1.0])
>>> d = defaultdict(int)
>>> for k, v in zip(a, b):
    d[k] +=  + v
...     
>>> d.keys(), d.values()
([3, 1, 'foo'], [1.0, 1.0, 0.5])