如何在没有重复的列表中查找第一个值?

时间:2018-11-08 05:03:35

标签: python python-3.x list

.grid-item {
    width: 160px;
    height: 120px;
    float: left;
    /* vertical gutter */
    margin-bottom: 20px;
    background: #D26;
    border: 2px solid #333;
    border-color: hsla(0, 0%, 0%, 0.5);
    border-radius: 5px;
}

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

6 个答案:

答案 0 :(得分:10)

在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))

答案 1 :(得分:1)

您可以将list转换为string,然后使用字符串的indexfind函数从左右比较每个字符的rfind。找到第一个匹配项后,它将立即停止计数,

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

def i_list(input):
    l1 = ''.join(input)
    for i in l1:
        if l1.find(i) == l1.rfind(i):
            return(i)


print(i_list(l1))

# output
C

答案 2 :(得分:1)

使用defaultdict的实现:

# Initialize
from collections import defaultdict
counts = defaultdict(int)

# Count all occurrences
for item in l1: 
    counts[item] += 1

# Find the first non-duplicated item
for item in l1:
    if counts[item] == 1: 
        l2 = [item]
        break
else:
    l2 = []

答案 3 :(得分:1)

作为ShadowRanger's answer的后续版本,如果您使用的是较低版本的Python,则过滤原始列表并没有那么复杂,因此您不必依靠柜台物品的顺序:

from collections import Counter

l1 = ['A','B','C','D','A','B']
c = Counter(l1)
l2 = [x for x in l1 if c[x] == 1][:1]

print(l2)  # ['C']

这也是 O(n)

答案 4 :(得分:0)

我们也可以使用“ numpy”来做到这一点。

def find_first_non_duplicate(l1):
    indexes_counts = np.asarray(np.unique(l1, return_counts=True, return_index=True)[1:]).T
    (not_duplicates,) = np.where(indexes_counts[:, 1] == 1)
    if not_duplicates.size > 0:
        return [l1[np.min(indexes_counts[not_duplicates, 0])]]
    else:
        return []

print(find_first_non_duplicate(l1))

# output
['C']

答案 5 :(得分:0)

一种获取列表中第一个唯一元素的更快方法:

  1. 逐个检查每个元素,并将其存储在dict中。
  2. 遍历dict并检查计数为

    的第一个元素
    def countElement(a):
        """
        returns a dict of element and its count
        """
        g = {}
        for i in a:
            if i in g: 
                g[i] +=1
            else: 
                g[i] =1
        return g
    
    
    #List to be processed - input_list
    input_list = [1,1,1,2,2,2,2,3,3,4,5,5,234,23,3,12,3,123,12,31,23,13,2,4,23,42,42,34,234,23,42,34,23,423,42,34,23,423,4,234,23,42,34,23,4,23,423,4,23,4] #Input from user
    
    
    try:
        if input_list: #if list is not empty
            print ([i for i,v in countElement(input_list).items() if v == 1][0]) #get the first element whose count is 1
        else: #if list is empty
            print ("empty list in Input")
    except: #if list is empty - IndexError
        print (f"Only duplicate values in list - {input_list}")