gpt4 book ai didi

python - 如何在 Python 中将唯一值的序数分配给列表?

转载 作者:行者123 更新时间:2023-11-30 22:29:50 25 4
gpt4 key购买 nike

假设我有一个列表

A = ['A', 'A', 'A', 'B', 'B', 'C']

如何将其变为

B = [0, 0, 0, 1, 1, 2]

我是这样写的

C = {t[1]:t[0] for t in enumerate(list(set(A)))}
B = [C[e] for e in A]

它给了

[1, 1, 1, 2, 2, 0]

即顺序看起来是随机的,而且整个代码看起来很复杂。

有没有更简单的方法?

最佳答案

我会假设: 1. 你不依赖于字母元素; 2. 您希望在列表 A 中第一次出现时对它们进行索引。

>>> A = ['A', 'A', 'A', 'B', 'B', 'C']
>>> seen=set()
>>> C={x:len(seen)-1 for x in A if not (x in seen or seen.add(x))}
>>> C
{'B': 1, 'C': 2, 'A': 0}
>>> list(map(C.get, A))
[0, 0, 0, 1, 1, 2]

第二行定义了一个集合,seen,它将存储我们已经在下一行的列表理解中看到的A的元素。

第三行定义将唯一元素映射到其索引的字典。这有点棘手(尽管并不罕见)。

我们迭代 A 的值。

  • 情况1:值x在seen中,因此seen或...中的x为True,第二个部分未评估,并且 not(...) 返回 False:x 被忽略。

  • 情况 2:值 x 在 saw 中,因此 x in sawFalse 对第二部分进行评估。请记住,seen.add 将始终返回 None,在这种情况下相当于 False。 saw 或 saw.add(x) 中的 x 为 False ,但 x 已添加到 seen 中。并且 not(...) 返回 True:x 映射到 seen 的 len,并递增每个新元素加一。

第六行只是将新定义的字典映射到A的值。

关于python - 如何在 Python 中将唯一值的序数分配给列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46245957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com