例如,调用consec(2, [2, 2, 3, 9, 9, 10, 1, 6, 6])
会返回{2 , 9, 6}
。我无法在itertools
中使用任何内容,我可以使用的是next
和iter
,我无法创建辅助列表来跟踪值或使用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
答案 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
的东西...