python - 使用列表推导根据使用其他列表的条件替换重复项
问题描述
用一个例子来说明它可能更容易。
A = [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]
B = [0.1, 0.2, 0.3, 0.4, 0.01, 0.02, 0.03, 0.04, 0.001, 0.001, 0.0003, 0.0003]
我有上面的两个列表。
A 中的每个元素都重复了几次。每个元素的多重性可以不同(并且不必像这里那样排序)。
B 包含与 A 相同数量的元素。我想将 A 中每个重复元素中的最小元素分配给列表 C(其中最小值来自 B 列表中的相应值。所以对于前 4 个元素,它将为 0.1,对于接下来的 4 个元素,在此示例中为 0.01,对于最后 4 个元素,它是 0.0003 的重复值,对于每个重复的元素,它都是 0.0003)。
我想获得以下列表。
C = [0.1, 0.1, 0.1, 0.1, 0.01, 0.01, 0.01, 0.01, 0.0003, 0.0003, 0.0003, 0.0003]
由于我正在使用的代码已经广泛使用列表理解,我想使用相同的方法。
这可能吗?
这是可取的吗?
我熟悉简单的条件,例如
C = A[B < 0.0005]
给予
C = [3]
但对如何在这里进行并没有明确的想法。
解决方案
您可以使用以下方法:
>>> A = [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]
>>> B = [0.1, 0.2, 0.3, 0.4, 0.01, 0.02, 0.03, 0.04, 0.001, 0.001, 0.0003, 0.0003]
>>> AB = zip(A, B)
>>> AB_sorted = sorted(AB, key=lambda i: (i[0], -i[1]))
>>> AB_dict = dict(AB_sorted)
>>> C = [AB_dict[i] for i in A]
>>> C
[0.1, 0.1, 0.1, 0.1, 0.01, 0.01, 0.01, 0.01, 0.0003, 0.0003, 0.0003, 0.0003]
这是有效的,因为当您将 a list
of tuple
s 转换为 a时dict
,重复的键会被最后一个键覆盖。
推荐阅读
- kubernetes - 通过 http 和 https 访问 Kubernetes 上的 .NET Core 应用程序
- ssl - 由中间 CA(go daddy)签署的有效证书不适用于少数客户端(docker alpine)
- java - 测试 pico cli 命令,Java
- c# - 如何对 RFC 3986 字符串进行转义
- java - Jackson - 带有列表的 Java 对象
- r - 将r中的数据矩形化的简单方法
- java - 如何使用@concat 函数在 ARM 模板中转义单引号
- java - 当 IDENTITY_INSERT 设置为 OFF 时,使用 Hibernate 批量插入时出现错误“无法在表中插入标识列的显式值”。
- maven - 子项目不从 Super POM 获取依赖项
- redmine - Redmine API 获取时间条目报告