如果另一个列表的某个条件为真,则覆盖列表值(python)

问题描述 投票:0回答:2

不幸的是,我无法对我的标题更具体,但一个例子应该让我的问题清楚。我有两个列表f和a,如果f [i]等于f [i-1]。我想在f中有一个新的条目,它等于f [i]和f [i-1](显然)并覆盖它们。在一个我想要a_new = a [i] + a [i-1]替换[i]和[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]

我相信某种列表理解将是最佳方法,但我还是无法弄明白。我不需要成为列表理解,只要有一些解决方案,我很高兴。

python list list-comprehension overwrite
2个回答
1
投票

您可以将zip列在一起,使用groupbyf值对对进行分组,然后将每个组的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)

0
投票

对于第一个阵列案例:

for i in range(1, len(f)-2):
    if f[i] == f[i-1]:
        del f[i]

print(f)
© www.soinside.com 2019 - 2024. All rights reserved.