如何给出n和可迭代的n个连续整数的集合?

时间:2015-08-06 19:19:52

标签: python loops python-3.x while-loop iteration

例如,调用consec(2, [2, 2, 3, 9, 9, 10, 1, 6, 6])会返回{2 , 9, 6}。我无法在itertools中使用任何内容,我可以使用的是nextiter,我无法创建辅助列表来跟踪值或使用len。

这是我到目前为止所拥有的:

consec(n,iterable):

result = set()
count = 0
y = iter(iterable)
j = iter(iterable)
next(j)
try:
    while True:
        for x in y:
            if x in result:
                 continue
            for m in range(n):
                if x == next(j):
                    count += 1
                    if count == n-1:
                        result.add(x)
                else:
                    count = 0
                    break
except StopIteration:
    return result

4 个答案:

答案 0 :(得分:1)

通过对iterable中的值进行简单的for循环,这应该很容易实现。只需计算连续多少次您已查看当前值以及何时达到n,请将其添加到结果中:

def consec(n, iterable):
    result = set()
    prev = None # use object() here instead if None could be a value in the iterable
    count = 0
    for item in iterable:
        if item == prev:
            count += 1
            if count == n:
                result.add(prev)
        else:
            prev = item
            count = 1
    return result

我不打算避免重复计算相同的值,因为set会忽略添加到其中的任何重复值。

如果由于某种原因需要使用while循环,您始终可以将for循环转换为一个。

for循环:

for item in iterable:
    stuff(item)

几乎相当于:

it = iter(iterable)
try:
    while True:
        item = next(it)
        stuff(item)
except StopIteration:
    del it

两个版本之间的唯一区别是迭代期间存在it变量。 (for循环使用的迭代器永远不会绑定到变量名。)

答案 1 :(得分:1)

def consec(n,l):
    return set(ele for i,ele in enumerate(l[:-1]) if all(ele == j for j in l[i:i+n]))

或者使用范围和索引而不是切片:

def consec(n,l):
     return set(ele for i, ele in enumerate(l[:-n+1]) if all(ele == l[j] for j in range(i,i+n)))

如果必须使用next,请使用范围为n-1的内部循环,查看下一个n - 1和prev是否相等,如果循环结束,则添加到集合中:

def consec(n,l):
    it = iter(l)
    prev = next(it)
    st = set()
    while prev != "":
        for i in range(n-1):
            ele = next(it,"")
            if ele != prev or ele == "":
                break
            prev = ele
        else:
            st.add(ele)
        prev = ele
    return st

答案 2 :(得分:0)

递归地执行:

GlobalCons = 2
def recurse(list, previous, consecCount):
  if(list == []):
    return []  
  if(consecCount != GlobalCons and previous == list[0]):
    return recurse(list[1:], list[0], consecCount + 1)
  if(consecCount == GlobalCons previous == list[0]):
    return [previous] + recurse(list[1:], list[0], consecCount + 1)
  else:
    return recurse(list[1:], list[0], 1)

答案 3 :(得分:0)

您可以使用itertools.groupby

def consec(n, iterable):
    return [k for k, g in itertools.groupby(iterable) if len(list(g)) == n]

示例:

>>> consec(2, [2, 2, 3, 9, 9, 10, 1, 6, 6])
[2, 9, 6]

编辑:哎呀,我想我读过“我不能在itertools中使用任何东西”,因为“我在itertools中找不到任何我可以使用的东西”,但你可能意味着“我不被允许”。无论如何,我会把这个留给那些可以使用来自itertools的东西...