python - 基于元素条件合并列表

标签 python list-comprehension

问题 1

我有四个长度相等的列表:A_old、A_new、B_old、B_new并且希望具有以下行为:如果A_new[i] > A_old[i]然后设置B_old[i] = B_new[i]

尝试了简单的循环实现:

for i, (a_new, a_old) in enumerate(izip(A_new, A_old)):
    if a_new > a_old:
        B_old[i] = B_new[i]

以及使用 map 的实现(如建议 here ):

B_old = map(lambda (a_new, a_old, b_new, b_old): b_new if a_new > a_old else b_old,
            izip(A_new, A_old, B_new, B_old))

但是这些方法都不够快。请注意,我无法使用 numpy 数组和 bool 数组,因为 B_new、B_old 的元素不是数字。

为了让事情更加正式,这里提供了一个示例实现:https://gist.github.com/1986588运行时间如下所示:

Naive: 1.13343191147
Mapping: 1.45240283012
kev: 1.09499907494
Numpy: 0.0525879859924
Where: 0.0651860237122

问题2

评估了不同的选项 numpy 使用 bool 数组进行切片似乎是可行的方法。然而,我现在遇到了一个新问题:

B_new不是一个数组,而只是一个值val。那么最佳变体为

B_old[A_new > A_old] = val

只要 val 不可迭代,此方法就可以正常工作,但当可迭代时就会失败。特别是,val 在这里是一个元组。我想将元组 val 分配给 B_old 的元素,其中 A_new > A_old

解决方法似乎是让

val2 = np.empty(1, dtype=object)
val2[0]=val
B_old[A_new > A_old] = val

但这看起来很复杂。问题是我不知道 val 的类型是什么。它可能是可迭代的,也可能不是。

最佳答案

B_old = [B_new[i] if A_new[i]>A_old[i] else B_old[i] for i in range(len(A_old))]

关于python - 基于元素条件合并列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9585072/

相关文章:

Python Numpy 使用先验值计算——无循环

python - 使用类属性作为函数参数?

Python 异步理解——它们是如何工作的?

python 列表理解字母生成

python - 如何更快地从列表中删除包含某些单词的字符串

python - Nim相当于Python的列表理解

for-loop - `for` 在此递归 Clojure 代码中如何工作?

python - 如何在 AJAX 中返回时将 python 中的数组转换为与 Google Charts 兼容

python - 如何模拟 celery 任务的类方法

python - 如何检查两个字符串是否是彼此的字谜?