Python 如何在列表中找到第二小的唯一编号?
我需要创建一个返回第二个最小唯一数字的函数,这意味着如果Python 如何在列表中找到第二小的唯一编号?,python,Python,我需要创建一个返回第二个最小唯一数字的函数,这意味着如果 list1=[5,4,3,2,2,1],我需要返回3,因为2不是唯一的 我试过: def second(list1): result = sorted(list1)[1] return result 及 但是他们都回来了 编辑1: 谢谢大家!我使用最后的代码使它工作: def second(list1): b = [i for i in list1 if list1.count(i) == 1] b.so
list1=[5,4,3,2,2,1]
,我需要返回3,因为2不是唯一的
我试过:
def second(list1):
result = sorted(list1)[1]
return result
及
但是他们都回来了
编辑1:
谢谢大家!我使用最后的代码使它工作:
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]中存在重复编号,则删除所有重复编号并返回第二个编号。
否则,如果列表1[0]中没有重复的编号,则只需使用EDIT1中的代码即可
排序/或
排序-O(nlongn)。(在任何情况下,如果您使用的是groupby
数据已经排序)我忽略了OP想要第二个最小值的事实,因此排序仍然是一个更好的选择
不使用任何花哨的东西,为什么不直接得到一个unique列表,对它进行排序,然后得到第二个列表项呢
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。好的,这里在列表中使用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(这意味着它在大型数据集上应该有更好的性能)
好的,伙计们!我得到了工作代码,这要感谢你的帮助,帮助我在正确的轨道上思考。此代码适用于:
`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`
您是如何确定某个数字是否唯一的?我的第二次尝试是删除列表中的重复项。。。。然后我知道我可以使用
sorted(list1)[2]
返回3。但是,我需要编写一个通用代码,其中列表可以是[5,4,4,3,3,2,2,1],我需要返回5,但我不能使用sorted(),因为我不知道放在方括号中的是什么。(已排序(列表1)[???])set(列表1)
不会删除多次出现的值{3,4,4}=>{3,4}
,而不是{3}
。您正在排序两次。一次使用b.sort
,第二次使用sorted(b)
我喜欢使用heapq
的想法,但是您否定了您的解决方案使用l1.count()
而不是适合在O(N)时间内进行计数的数据结构(例如collections.Counter
),甚至O(NlogN)所具有的算法优势(itertools.groupby
+sort
)。使用l1.count()
使这成为一个O(N^2)算法:-)。是的,本可以使用性能更好的集合。下次会用的。感谢@mgilson的指导!“好的,每个人都说在列表中使用set()”中的“每个人”是谁?没有人建议使用set()来获取uniques。@BlivetWidget我对每个人的意思是,如果你在谷歌上搜索删除重复项或清除重复项,有7/10的人建议使用set()
函数。通过这种方式,这里没有人提出过这样的建议!反正我会在这里换的!谢谢嘿,谢谢!我使用了你的代码,在添加了一些行之后得到了我需要的结果
[5, 4, 3, 1]
print heapq.nsmallest(2, newlist)[-1]
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`