簡體   English   中英

如何在列表中找到第二個最小的UNIQUE編號?

[英]How to find second smallest UNIQUE number in a list?

我需要創建一個函數,返回第二個最小的唯一數字,這意味着如果
list1 = [5,4,3,2,2,1] ,我需要返回3,因為2不是唯一的。

我試過了:

def second(list1):
    result = sorted(list1)[1]
    return result

def second(list1):
    result = list(set((list1)))
    return result

但他們都返回2。

EDIT1:

多謝你們! 我使用這個最終代碼工作了:

def second(list1):
    b = [i for i in list1 if list1.count(i) == 1]
    b.sort()
    result = sorted(b)[1]
    return result

編輯2:

好吧......真的很困惑。 我的教授告訴我,如果list1 = [1,1,2,3,4] ,它應該返回2,因為2仍然是第二個最小的數字,如果list1 = [1,2,2,3,4] ,它應該返回3.如果list1 = [1,1,2,3,4] ,eidt1中的代碼將不起作用。 我想我需要做的事情如下:

如果位置list1 [0]中有重復的數字,則刪除所有重復項並返回第二個數字。 否則,如果重復的數字位置不在list1 [0]中,那么只需使用EDIT1中的代碼即可。

沒有使用任何花哨的東西,為什么不只是得到一個獨特的列表,排序它,並得到第二個列表項?

a = [5,4,3,2,2,1] #second smallest is 3
b = [i for i in a if a.count(i) == 1]
b.sort()
>>>b[1]
3


a = [5,4,4,3,3,2,2,1] #second smallest is 5
b = [i for i in a if a.count(i) == 1]
b.sort()
>>> b[1]
5

顯然你應該測試你的列表中至少有兩個唯一的數字。 換句話說,確保b的長度至少為2。

  1. 刪除非唯一元素 - 使用sort / itertools.groupbycollections.Counter
  2. 使用min - O(n)來確定最小值而不是 sort - O(nlongn)。 (無論如何,如果你使用 groupby數據已經排序了) 我錯過了OP想要第二個最小值的事實,所以這里排序仍然是一個更好的選擇

示例代碼

使用計數器

>>> sorted(k for k, v in Counter(list1).items() if v == 1)[1]
1

使用Itertools

>>> sorted(k for k, g in groupby(sorted(list1)) if len(list(g)) == 1)[1]
3

好的,這里使用列表中的set()不會有幫助。 它不會清除重復的元素。 我的意思是 :

l1=[5,4,3,2,2,1]
print set(l1)

打印

[0, 1, 2, 3, 4, 5]

在這里,您不是刪除重復的元素,但列表是唯一的

在您的示例中,您要刪除所有重復的元素。 嘗試這樣的事情。

l1=[5,4,3,2,2,1]
newlist=[]
for i in l1:
    if l1.count(i)==1:
    newlist.append(i)
print newlist 

在此示例中打印

[5, 4, 3, 1]

然后你可以使用heapq來獲得列表中的第二大數字,就像這樣

print heapq.nsmallest(2, newlist)[-1]

導入: import heapq ,上面的代碼段為您打印3 這應該是訣竅。 干杯!

這是一種不使用count的更好的方法(這意味着它應該在大型數據集上具有明顯更好的性能)。

from collections import defaultdict

def getUnique(data):
    dd = defaultdict(lambda: 0)
    for value in data:
        dd[value] += 1
    result = [key for key in dd.keys() if dd[key] == 1]
    result.sort()
    return result

a = [5,4,3,2,2,1]
b = getUnique(a)
print(b)
# [1, 3, 4, 5]
print(b[1])
# 3

好的伙計們! 我得到了你的所有幫助,並幫助我思考正確的軌道,我得到了工作代碼。 此代碼有效:

`def second(list1):
    if len(list1)!= len(set(list1)):
         result = sorted(list1)[2]
        return result
    elif len(list1) == len(set(list1)):
        result = sorted(list1)[1]
        return result`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM