Python 函数获取iterabls并返回一个列表
当生成器将一个iterable和一个谓词作为参数时,组_:它生成列表,每个列表都以iterable中谓词为True的值结尾。如果iterable以谓词返回False的值结束,则生成一个最终列表,其中包含从前一个结束后的值到iterable生成的最后一个值的所有值 例如: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:
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
我打赌这就是他的代码实际包含的内容@