在Python集中查找最小的连续整数

时间:2010-12-07 15:32:37

标签: python set

获取Python集中最小N个连续整数列表的最佳方法是什么?

>>> s=set([5,6,10,12,13,15,30,40,41,42,43,44,55,56,90,300,500])
>>> s
set([42, 43, 44, 5, 6, 90, 300, 30, 10, 12, 13, 55, 56, 15, 500, 40, 41])
>>> smallest_contiguous(s,5)
[40,41,42,43,44]
>>> smallest_contiguous(s,6)
[]

编辑:感谢大家的答案。

6 个答案:

答案 0 :(得分:3)

斯文有正确的想法。您可以通过只检查前面的数字N - 1来避免检查超集。

def smallest_contiguous(s, N):
    lst = list(s)
    lst.sort()
    Nm = N-1
    for i in xrange(len(lst) - Nm):
        if lst[i] + Nm == lst[i + Nm]:
            return range(lst[i], lst[i]+N)
    return []

对于一个集合作为输入并且知道该集合仅包含整数,这将始终是正确的。

答案 1 :(得分:2)

这个怎么样?

def smallest_contiguous(s, N):
    lst = sorted(s)
    for i in lst:
        t = range(i, i+N)
        if s.issuperset(t):
            return t
    return []

它可能不是最有效的解决方案,但它很简洁。

编辑:贾斯汀的方法也可以更简洁:

def smallest_contiguous(s, N):
    lst = sorted(s)
    for a, b in zip(lst, lst[N - 1:]):
        if b - a == N - 1:
            return range(a, b + 1)
    return []

答案 2 :(得分:2)

应该这样做......在排序列表中向前看length - 1个步骤。由于它仅包含整数并且已排序,因此差异也必须为length - 1

def smallest_contiguous(myset, length):
    if len(myset) < length:
        return []

    s = sorted(myset)
    for idx in range(0, len(myset) - length + 1):
        if s[idx+length-1] - s[idx] == length - 1:
            return s[idx:idx+length]

    return []

s=set([5,6,10,12,13,15,30,40,41,42,43,44,55,56,90,300,500])
print smallest_contiguous(s, 5)
print smallest_contiguous(s, 6)

答案 3 :(得分:0)

这是我提出的一个:

def smallest_contiguous(s,N):
    try:
        result = []
        while len(result) < N:
            min_value = min(s)
            s.remove(min_value)
            if result == [] or min_value == result[-1] + 1:
                result.append(min_value)
            else:
                result = [min_value]
        return result
    except ValueError:
        return []

它将输入集修改为副作用。

答案 4 :(得分:0)

itertools救援。 groupby在这里完成了所有的工作 由于调用sorted()

,算法为O(n logn)
>>> from itertools import groupby, count
>>> def smallest_contiguous(s, N):
...     for i,j in groupby(sorted(s), key=lambda i,c=count().next: i-c()):
...         res = list(j)
...         if len(res) == N:
...             return res
...     return []

... 
>>> smallest_contiguous(s,5)
[40, 41, 42, 43, 44]
>>> smallest_contiguous(s,6)
[]

答案 5 :(得分:0)

def smallest_contiguous(s, n):
    xs = sorted(s)
    return next(x for i, x in enumerate(xs) if xs[i + n - 1] == x + n - 1)