Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在列表中找到第二小的唯一编号?_Python - Fatal编程技术网

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中的代码即可

  • 删除非唯一元素-使用
    排序
    /或
  • 使用min-O(n)来确定最小值,而不是
    排序
    -O(nlongn)。(在任何情况下,如果您使用的是
    groupby
    数据已经排序)我忽略了OP想要第二个最小值的事实,因此排序仍然是一个更好的选择
  • 示例代码

    使用计数器

    使用Itertools


    不使用任何花哨的东西,为什么不直接得到一个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`