不幸的是,我无法更详细地说明标题,但举个例子可以使我的问题更清楚。我有两个列表f和a,如果f [i]等于f [i-1]。我想在f中有一个新条目,它等于f [i]和f [i-1](显然),并覆盖它们两者。在a中,我想a_new = a [i] + a [i-1]替换a [i]和a [i-1]。
f = [10, 25, 50, 50, 75, 100, 1000, 1000, 1100, 1100]
a = [1, 3, 2, 4, 5, 3, 10, 15, 5, 5]
我想要的输出是:
f = [10, 25, 50, 75, 100, 1000, 1100]
a = [1, 3, 6, 5, 3, 25, 10]
我相信某种形式的列表理解将是最佳的方法,但是我还不能弄清楚。不过,我不需要成为列表理解者,只要有解决方案,我就很高兴。
答案 0 :(得分:1)
您可以zip
一起列出列表,使用groupby
按f
值对对分组,然后将每个组的a
值相加。然后,您只需将它们解压缩到单独的列表中
from itertools import groupby
from operator import itemgetter
groups = groupby(zip(f, a), key=itemgetter(0))
f_a_generator = ((k, sum(map(itemgetter(1), pairs))) for k, pairs in groups)
f1, a1 = zip(*f_a_generator) # map(list, ...) If you need them as lists
print(f1, a1, sep='\n')
# (10, 25, 50, 75, 100, 1000, 1100)
# (1, 3, 6, 5, 3, 25, 10)
要在评论中回答您的问题,您可以更改行
sum(map(itemgetter(1), pairs)))
调用sum
以外的其他功能:
def logarithmic_sum(values):
return 10*np.log10(sum((10**(val/10)) for val in values))
groups = groupby(zip(f, a), key=itemgetter(0))
f_a_generator = ((k, logarithmic_sum(map(itemgetter(1), pairs))) for k, pairs in groups)
f1, a1 = zip(*f_a_generator)
print(f1, a1, sep='\n')
# (10, 25, 50, 75, 100, 1000, 1100)
# (1.0000000000000002, 2.999999999999999, 6.124426027943397, 5.0, 2.999999999999999, 16.193310480660944, 8.010299956639813)
答案 1 :(得分:0)
对于第一个数组案例:
for i in range(1, len(f)-2):
if f[i] == f[i-1]:
del f[i]
print(f)