python - 如果另一个列表的某个条件为真,则覆盖列表值(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]
我相信某种列表理解将是最佳方法,但我还想不通。不过,我不需要成为列表理解者,只要有一些解决方案,我就会很高兴。
解决方案
您可以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)
推荐阅读
- javascript - Android 中的 Stripe 结账集成
- python - 使用 Selenium 进行网页抓取:不知道文本来自哪里
- deep-learning - 在 allennlp 中使用 Transformer QA 预训练模型进行阅读理解的通过限制
- c# - Kendo UI 文件夹上传时出错 - ERR_CONNECTION_RESET
- java - Swing JMenuBar 无法正确呈现
- node.js - 无法从 safari 浏览器上传 .wav 文件,chrome 使用 angular 7
- mysql - 如何仅选择列值更改的最后 X 值
- ruby - 是否有用于配置标志的 rvm 环境变量?
- java - 如何在 javafx 中的 setOnDragDetected 中更改鼠标图标
- r - How to tune a tidymodels recipe parameter?