函数接受iterabls并返回一个列表

时间:2016-10-27 19:31:13

标签: python 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 

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

例如:

for i in group_when('combustibles', lambda x : x in 'aeiou'):
    print(i,end='')

打印5个列表[' c',' o'] [' m',' b',' u& #39;] [']' t','我'] [' b',' l' ,' e'] [' s']。

我的功能是如此接近正确的答案。当输入

('combustibles', lambda x : x in 'aeiou') 

我的函数返回

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

但正确的输出应为:

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

因此,我只是错过了最后一封信'。 任何人都可以告诉我如何解决它?非常感谢

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

 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']]

3 个答案:

答案 0 :(得分:1)

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

if z:
    d.append(z)

仅当z不为空时才会添加yield。但是您的代码缺少return或实际的if p(y): z.append(y) d.append(z) z = [] else: z.append(y) 语句,所以我不确定这应该发生在哪里。

此外,您无需直接将其与布尔值进行比较。事实上,您可以执行以下操作:

{{1}}

答案 1 :(得分:1)

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

如果p(y)在迭代中为最后一个y为假,则

z不会附加到d。你应该处理那个案子。

扩展您的代码,然后再添加2行,除非如下所述:

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 

答案 2 :(得分:1)

因此,请使用原始表单,这就是我解决问题的方法。

def group_when(iterable,p):
    x = iter(iterable)
    z = []
    d = []
    for y in x:
        z.append(y)
        if p(y):
            d.append(z) 
            z = []
    if z:
        d.append(z) 
    return d   #added the d here, think OP dropped it by accident