python - 如何在没有重复项的列表中找到第一个值?

标签 python python-3.x list

l1 = ['A','B','C','D','A','B']
l2 = []

'C' 是列表 l1 中的第一个值,我想创建一个函数,以便它在 l2 中返回 C。

最佳答案

在 3.6 及更高版本中,这非常很容易。现在 dict 保留了插入顺序,collections.Counter 可用于在一次传递中有效地计算所有 元素,然后您只需扫描生成的 Counter 以便找到计数为 1 的第一个元素:

from collections import Counter

l1 = ['A','B','C','D','A','B']
l2 = [next(k for k, v in Counter(l1).items() if v == 1)]

工作是严格的 O(n),只需要输入一次(加上 Counter 本身的唯一值的部分传递),并且代码非常简单。在现代 Python 中,Counter 甚至有一个用于计算输入的 C 加速器,它将所有 Counter 的构建工作推到 C 层,使其无可匹敌。如果您想考虑不存在此类元素的可能性,只需包装 l2 初始化即可:

try:
    l2 = [next(k for k, v in Counter(l1).items() if v == 1)]
except StopIteration:
    l2 = []
    # ... whatever else makes sense for your scenario ...

或者用itertools.islice避免异常处理(所以l2是0-1项,一旦找到命中它仍然会短路):

from itertools import islice

l2 = list(islice((k for k, v in Counter(l1).items() if v == 1), 1))

关于python - 如何在没有重复项的列表中找到第一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53201823/

相关文章:

python - xy点的测量结构-python

c# - 在属性中使用 .Add() 方法添加元素后,list.Count 为零

python - 我可以在 Python 中使用过滤器获取函数列表吗?

python - 如何用漂亮的汤跳过<span>

java - 将列表传递给 freemarker

python - 为什么从 ipython notebook 生成的 matplotlib 图与终端版本略有不同?

带有 Stripe 的 Python : How do I get valid JSON from a charge response?

python - 如何获取单元格的值而不是公式值?

python-3.x - Asyncio 关闭连接使连接处于 TIME_WAIT 状态

python - 在 Azure 上的 Python WebJob 中导入 Numpy