首页 > 解决方案 > 使用列表推导根据使用其他列表的条件替换重复项

问题描述

用一个例子来说明它可能更容易。

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]

但对如何在这里进行并没有明确的想法。

标签: pythonlist-comprehension

解决方案


您可以使用以下方法:

>>> 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 listof tuples 转换为 a时dict,重复的键会被最后一个键覆盖。


推荐阅读