Python 函数获取iterabls并返回一个列表

Python 函数获取iterabls并返回一个列表,python,iterable,Python,Iterable,当生成器将一个iterable和一个谓词作为参数时,组_:它生成列表,每个列表都以iterable中谓词为True的值结尾。如果iterable以谓词返回False的值结束,则生成一个最终列表,其中包含从前一个结束后的值到iterable生成的最后一个值的所有值 例如: def group_when(iterable,p): x = iter(iterable) z = [] d = [] try: while True:

当生成器将一个iterable和一个谓词作为参数时,组_:它生成列表,每个列表都以iterable中谓词为True的值结尾。如果iterable以谓词返回False的值结束,则生成一个最终列表,其中包含从前一个结束后的值到iterable生成的最后一个值的所有值

例如:

def group_when(iterable,p):
    x = iter(iterable)
    z = []
    d = []
    try:
        while True:
            y = next(x)
            if p(y) == False:
                z.append(y)
            elif p(y) == True:
                z.append(y)
                d.append(z) 
                z = []
    except StopIteration:
        pass
    return 
打印5个列表['c'、'o']['m'、'b'、'u']['s'、't'、'i']['b'、'l'、'e']['s']

我的函数非常接近正确答案。当输入为

for i in group_when('combustibles', lambda x : x in 'aeiou'):
    print(i,end='')
我的函数返回

('combustibles', lambda x : x in 'aeiou') 
但正确的输出应该是:

[['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e']] 
因此,我只遗漏了最后一个字母“s”。 有人能告诉我怎么修吗?非常感谢

我在下面发布了我得到的错误,只是为了帮助您理解我的功能:

[['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']]

问题是,如果您得到一个谓词,那么只需将
z
添加到
d
。因此,如果字符串没有以谓词结尾,它将不会最后一次添加
z
。所以你需要在结尾的某个地方:

 26 *Error: Failed [v for v in group_when('combustibles', lambda x : x in 'aeiou')] == [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']]
      evaluated: [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e']] == [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']]
 27 *Error: Failed [v for v in group_when(hide('combustibles'), lambda x : x in 'aeiou')] == [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']]
      evaluated: [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e']] == [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']]
只有当z不为空时,才会添加
z
。但是您的代码缺少
yield
或实际的
return
语句,因此我不确定应该在哪里发生这种情况

你也不需要直接把它和布尔人比较。事实上,您可以执行以下操作:

if z:
    d.append(z)

问题是,如果您得到一个谓词,那么只需将
z
添加到
d
。因此,如果字符串没有以谓词结尾,它将不会最后一次添加
z
。所以你需要在结尾的某个地方:

 26 *Error: Failed [v for v in group_when('combustibles', lambda x : x in 'aeiou')] == [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']]
      evaluated: [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e']] == [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']]
 27 *Error: Failed [v for v in group_when(hide('combustibles'), lambda x : x in 'aeiou')] == [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']]
      evaluated: [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e']] == [['c', 'o'], ['m', 'b', 'u'], ['s', 't', 'i'], ['b', 'l', 'e'], ['s']]
只有当z不为空时,才会添加
z
。但是您的代码缺少
yield
或实际的
return
语句,因此我不确定应该在哪里发生这种情况

你也不需要直接把它和布尔人比较。事实上,您可以执行以下操作:

if z:
    d.append(z)

当谓词为迭代器中的最后一个元素返回False时,代码将给出错误的结果

如果p(y)对于iterable中的最后一个y为False,则z不会附加到d。你应该处理那个案子

扩展您的代码并在后面再添加2行,以下情况除外:

if p(y):
    z.append(y)
    d.append(z)
    z = []
else:
    z.append(y)

您可以使用以下代码执行相同的工作:

except StopIteration:
        pass
if len(z) !=0:
    y.append(z)

以下是代码的生成器版本:

def group_when(iterable,p):
    z = []
    d = []

    for y in iterable:
        z.append(y)
        if p(y) is True:
            d.append(z)
            z=[]
    if z:
        d.append(z)
    return d

当谓词为迭代器中的最后一个元素返回False时,代码将给出错误的结果

如果p(y)对于iterable中的最后一个y为False,则z不会附加到d。你应该处理那个案子

扩展您的代码并在后面再添加2行,以下情况除外:

if p(y):
    z.append(y)
    d.append(z)
    z = []
else:
    z.append(y)

您可以使用以下代码执行相同的工作:

except StopIteration:
        pass
if len(z) !=0:
    y.append(z)

以下是代码的生成器版本:

def group_when(iterable,p):
    z = []
    d = []

    for y in iterable:
        z.append(y)
        if p(y) is True:
            d.append(z)
            z=[]
    if z:
        d.append(z)
    return d

按照你原来的表格,这就是我如何解决你的问题

def group_when(iterable,p):
    z = []
    for y in iterable:
        z.append(y)
        if p(y) is True:
            yield z
            z=[]
    if z :
        yield z
    return 

按照你原来的表格,这就是我如何解决你的问题

def group_when(iterable,p):
    z = []
    for y in iterable:
        z.append(y)
        if p(y) is True:
            yield z
            z=[]
    if z :
        yield z
    return 


使用
进行循环,而不是
。只调用
p(y)
一次。我不是100%确定,但你不需要最后一个d.append(z)?而且这不是真正的生成器,对吗?要使其成为生成器,应使用
yield
。我当然不是这方面的专家,但我认为情况一直如此。@bravosierra99最后,你的意思是在哪里?@Daniel我真的不知道如何使用for循环来实现它,比如iter中的x(iterable)?你能给我举个例子吗?用
代替
while
进行
循环。只调用
p(y)
一次。我不是100%确定,但你不需要最后一个d.append(z)?而且这不是真正的生成器,对吗?要使其成为生成器,应使用
yield
。我当然不是这方面的专家,但我认为情况一直如此。@bravosierra99最后,你的意思是在哪里?@Daniel我真的不知道如何使用for循环来实现它,比如iter中的x(iterable)?你能给我举个例子吗?不客气!谢谢你接受了答案。虽然我会告诉你,这似乎不是一个发电机,可以很容易地变成一个!您可以考虑使用
yield
命令来实现这一点。您可以
生成z
来代替
d.append(z)
,我相信它可以作为一个生成器工作。@bravosierra99您在哪里返回值?我错过什么了吗?不,我一点都不知道@Shasha99!!但是他没有在他的代码中返回值,所以我不想太介入这里发生的事情。我刚刚解决了他遇到的问题。但你是对的,我不知道他是如何得出这些值的。除非他的代码以
return d
结尾,并且
d
被切断……如果p(y)=False,我们真的需要吗?正如我在回答中提到的,这可能会更干净一些。如果我已经编写了代码,我已经应用了我现在将应用的所有更改。欢迎您!谢谢你接受了答案。虽然我会告诉你,这似乎不是一个发电机,可以很容易地变成一个!您可以考虑使用
yield
命令来实现这一点。您可以
生成z
来代替
d.append(z)
,我相信它可以作为一个生成器工作。@bravosierra99您在哪里返回值?我错过什么了吗?不,我一点都不知道@Shasha99!!但是他没有在他的代码中返回值,所以我不想太介入这里发生的事情。我刚刚解决了他遇到的问题。但你是对的,我不知道他是如何得出这些值的。除非他的代码以
return d
结尾,并且
d
被切断……如果p(y)=False,我们真的需要吗?正如我在回答中提到的,这可能会更干净一些。如果我写了代码,我已经应用了我现在将应用的所有更改。这是一个不错的解决方案,但是
len(z)
是不必要的
if z:
返回
False
如果是空列表
[]
是的,我看到你添加了
d
我打赌这就是他的代码实际包含的内容@