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

不幸的是,我无法更具体地说明我的标题,但举个例子应该可以清楚地说明我的问题。我有两个列表 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]

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


慕无忌1623718
浏览 200回答 2
2回答

慕虎7371278

您可以zip将列表放在一起,用于groupby按f值对对进行分组,然后a对每个组的值求和。然后你只需要将它们解压缩回单独的列表from itertools import groupbyfrom operator import itemgettergroups = 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 listsprint(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)

SMILET

对于第一个数组情况:for i in range(1, len(f)-2):    if f[i] == f[i-1]:        del f[i]print(f)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go