我有一对长度相同的列表,第一个包含int值,第二个包含浮点值.我希望用另一对列表替换它们,这些列表可能更短,但仍然具有相同的长度,其中第一个列表仅包含唯一值,第二个列表将包含每个匹配值的总和.也就是说,如果新对中第一个列表的第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])
我试图在这里做一些列表理解技巧但失败了.我可以为此编写一个愚蠢的循环函数,但我相信这里应该有更好的东西.
最佳答案 不是一个单行,但由于你没有发布你的解决方案,我会建议使用
collections.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])
当然,如果订单无关紧要,那么最好使用collections.defaultdict
:
>>> 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])