任何帮助都是非常好的。我试着在这里理解Iterable对象:
这里我要定义一个函数in_a_row,它传递一个整数参数(称之为n)和迭代参数。此函数返回迭代中连续出现n次的一组值:in_a_row(2,[4,4,2,6,6,9,6,7,7,3,2,2])返回{2,4,6,7}。如果iterable不包含至少n个值,则返回空集。如果n不是至少2,则引发AssertionError。
我提出了代码:
def in_a_row(n,iterable):
assert n>=2, 'n has to at least 2'
result = set()
while any(iterable):
copy = iter(iterable)
for i in copy:
print(i)
if i == next(iterable):
result.add(i)
yield result
但是当我测试测试用例时:
print('Testing in_a_row')
print(in_a_row(2,[4,4,2,6,6,9,6,7,7,3,2,2]))
print(in_a_row(3,[5,3,7,7,7,2,3,8,5,4,4,4,6]))
print(in_a_row(4,[5,5,5]))
for i in range(5,1,-1):
print('for',i,'=',in_a_row(i,map(lambda x : x.rstrip(),open('in_a_row.txt'))))
我得到了所有奇怪的结果Iterable Object:(+ _ +")?!
Testing in_a_row
<generator object in_a_row at 0x02871AF8>
<generator object in_a_row at 0x02871AF8>
<generator object in_a_row at 0x02871AF8>
for 5 = <generator object in_a_row at 0x028804B8>
for 4 = <generator object in_a_row at 0x028804B8>
for 3 = <generator object in_a_row at 0x028804B8>
for 2 = <generator object in_a_row at 0x028804B8>
假设要回溯数字的set()?!
{4,6,7,2}
{7,4}
{}
{'l', 'i'}
{'l', 'i', 'c'}
{'l', 'm', 'i', 'f', 'c', 'x', 'z'}
不能使用任何buit-in函数python,如#34; itertools&#34;,只有while + iter + next :(
答案 0 :(得分:2)
您每次都会产生一个项目,所以如果您想在set
中实现这些项目,则必须使用set
,例如:
print(set(in_a_row(2,[4,4,2,6,6,9,6,7,7,3,2,2])))
^^^
但是,您可以使用itertools.groupby
大规模简化功能,并返回set
以开始:
from itertools import groupby
def in_a_row(n, iterable):
return {k for k, g in groupby(iterable) if len(list(g)) >= n}
如果您想坚持一次产生一个值,并将它们放在set
之后,那么您可以这样做:
from itertools import groupby
def in_a_row(n, iterable):
yield from (k for k, g in groupby(iterable) if len(list(g)) >= n)