Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python <;在行0x0xxxxxxx处的生成器对象>;_Python_Python 3.x_Iterator_Generator - Fatal编程技术网

Python <;在行0x0xxxxxxx处的生成器对象>;

Python <;在行0x0xxxxxxx处的生成器对象>;,python,python-3.x,iterator,generator,Python,Python 3.x,Iterator,Generator,非常感谢您的帮助。我在这里试图理解Iterable对象: 这里我必须在一行中定义一个函数,它被传递一个整数参数(称为n)和iterable参数。此函数返回一行中出现n次的iterable中的一组值:在行中(2,[4,4,2,6,6,9,6,7,7,3,2,2])返回{2,4,6,7}。如果iterable不包含至少n个值,则返回一个空集。如果n不至少为2,则引发断言错误 我想出了密码: def in_a_row(n,iterable): assert n>=2, 'n has to

非常感谢您的帮助。我在这里试图理解Iterable对象:

这里我必须在一行中定义一个函数,它被传递一个整数参数(称为n)和iterable参数。此函数返回一行中出现n次的iterable中的一组值:在行中(2,[4,4,2,6,6,9,6,7,7,3,2,2])返回{2,4,6,7}。如果iterable不包含至少n个值,则返回一个空集。如果n不至少为2,则引发断言错误

我想出了密码:

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'))))
我得到了所有奇怪的结果:(+++)可重用对象


不能使用任何内置函数python,如“itertools”,只能在loop+iter+next:(

每次生成一个项,因此如果要在
集合中实现它们,必须使用
集合,例如:

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}
如果您希望坚持一次生成一个值,并在以后将其放入
集合
,则可以执行以下操作:

from itertools import groupby
def in_a_row(n, iterable):
    yield from (k for k, g in groupby(iterable) if len(list(g)) >= n)

感谢您提供的解决方案,但在这种情况下,我无法使用任何内置函数python,如“itertools”:(@trunnguyen好吧,坚持使用您的自定义函数,只需在其上使用
set(…)
),那么…您能给我演示一下吗?我一直在研究如何在其上使用set(…):(@trunnguyen我发布的第一行代码是一个如何更改您的第一个打印语句的示例…尝试一下-这将从生成器的结果中生成一个
set
。(这些结果是否正确取决于您)我无法更改测试用例,因为我被卡住了:(旁白:
whileany(iterable)
检查是否有任何值是truthlike;例如,如果
iterable==[0,0,0]
any(iterable)
将为False,因此不会输入循环。这真的是您想要的吗?
from itertools import groupby
def in_a_row(n, iterable):
    return {k for k, g in groupby(iterable) if len(list(g)) >= n}
from itertools import groupby
def in_a_row(n, iterable):
    yield from (k for k, g in groupby(iterable) if len(list(g)) >= n)