[英]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。
sort
/ itertools.groupby
或collections.Counter
sort
- O(nlongn)。
groupby
数据已经排序了)
示例代码
使用计数器
>>> 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.