如何在列表中找到第二个最小的UNIQUE编号?

时间:2015-12-08 04:09:05

标签: python

我需要创建一个返回第二个最小唯一编号的函数,这意味着如果是 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中的代码。

5 个答案:

答案 0 :(得分:3)

如果没有使用任何花哨的东西,为什么不只是获取唯一身份列表,对其进行排序,并获取第二个列表项?

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 :(得分:2)

  1. 删除非唯一元素 - 使用sort / itertools.groupbycollections.Counter
  2. 使用min - O(n)确定最小值而不是sort - O(nlongn)。 (无论如何,如果你使用groupby数据已经排序了)我错过了OP想要第二个最小值的事实,所以排序仍然是更好的选择
  3. 示例代码

    使用计数器

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

答案 2 :(得分:0)

好的,在列表中使用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。 这应该是诀窍。干杯!

答案 3 :(得分:0)

这是一种没有使用计数的更好的方法(这意味着它应该在大型数据集上具有明显更好的性能)。

"2"

答案 4 :(得分:0)

好的伙计们!我得到了你的所有帮助,并帮助我思考正确的轨道,我得到了工作代码。此代码有效:

Xdocument = XDocument.Load("XMLFilePath");
 List<Person> persons = (from person in xdoc.Descendants("person")
                         let personaldata = person.Element("personaldata")
                         let Educationaladata = person.Element("Educationaladata")
                         select new Person
                                {
                                  name = (string)personaldata.Element("name"),
                                  lastname = (string)personaldata.Element("lastname"),
                                  Graduation = (string)Educationaladata.Element("Graduation"),
                                  designation = (string)Educationaladata.Element("designation")
                                 }).ToList();