<generator object =“”in_a_row =“”at =“”0x0xxxxxxx =“”> </generator>

时间:2014-04-30 17:06:50

标签: python python-3.x iterator generator

任何帮助都是非常好的。我试着在这里理解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:(+ _ +&#34;)?!

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

1 个答案:

答案 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)