根据使用其他lis的条件,使用列表理解替换重复项

2024-03-29 11:25:09 发布

您现在位置: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]

我有上面的两张单子。你知道吗

图中的每个元素都被复制了几次。每个元素的多重性可以不同(它们不必像这里那样排序)。你知道吗

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]

但我不知道该怎么做。你知道吗


Tags: 方法代码元素列表数量排序情况例子
3条回答

如果不介意使用另一个名为Pandas的Python库,可以执行以下操作:

import pandas as pd
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]
df = pd.DataFrame([A, B]).T.rename(columns={0: 'A', 1: 'B'})
req_dict = {key: value for key, value in df.groupby('A')['B'].min().iteritems()}
print(df['A'].replace(req_dict))

输出:

[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 = [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]

这是因为当您将tuplelist转换为dict时,重复的键会被最后一个键覆盖。你知道吗

如果你想要一行,假设我的评论是正确的解释,这是可行的:

[min([B[j] for j in [ind for ind,x in enumerate(A) if x==y]]) for y in A]

要分解它,最里面的列表理解将遍历A中的索引和值,然后下一个列表理解将再次遍历A中的所有值(将它们存储在y),并用作前面提到的列表的条件。
然后使用这个索引列表获取B(使用j)中的所有元素,最后获取该列表中的min。你知道吗

enumerate将索引和值分别返回到indx。你知道吗

相关问题 更多 >