【问题标题】:<generator object in_a_row at 0x0xxxxxxx><generator object in_a_row at 0x0xxxxxxx>
【发布时间】:2014-06-17 03:03:15
【问题描述】:

非常感谢任何帮助。我尝试在这里理解 Iterable Object:

这里我必须定义一个函数 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}。如果可迭代对象不包含至少 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'}

不能使用任何像“itertools”这样的内置函数python,只能使用while循环+iter+next:(

【问题讨论】:

  • 旁白:while any(iterable) 检查是否有任何值是真值;例如,如果iterable == [0,0,0]any(iterable) 将为 False,因此不会进入循环。这真的是你想要的吗?

标签: python python-3.x iterator generator


【解决方案1】:

你每次都会产生一个项目,所以如果你想在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)

【讨论】:

  • 感谢您的解决方案,但在这种情况下,我不能使用任何内置函数 python,如“itertools”:(
  • @TrungNguyen 好吧,坚持使用您的自定义函数,然后在其上使用 set(...)...
  • 你能给我看看吗?我被困在如何使用 set(...) 上?! :(
  • @TrungNguyen 我发布的第一行代码是如何更改您的第一个打印语句的示例...尝试一下 - 这将在您的结果中生成 set生成器...(这些是否正确取决于您)
  • 我无法更改我被卡住的 test_case :(
猜你喜欢
  • 2020-01-11
  • 2018-05-11
  • 2013-04-28
  • 2022-08-11
  • 1970-01-01
  • 2016-04-29
  • 2018-04-22
  • 1970-01-01
相关资源
最近更新 更多