列表理解失败,但为什么?

2024-09-30 18:32:46 发布

您现在位置:Python中文网/ 问答频道 /正文

谁能向我解释为什么这个列表理解失败:

provider1 = {'id': 1, 'name': 'Een'}
provider2 = {'id': 2, 'name': 'Twee'}
provider3 = {'id': 3, 'name': 'Drie'}
provider4 = {'id': 4, 'name': 'Vier'}
provider5 = {'id': 5, 'name': 'Vijf'}
provider6 = {'id': 6, 'name': 'Zes'}
provider7 = {'id': 7, 'name': 'Zeven'}

providers = [provider1, provider2, provider3, provider4, provider5, provider6, provider7]


def testfunc(id):
    return next(provider for provider in providers if int(provider['id']) == int(id))


for x in range(0, 8):
    print testfunc(x)

当我运行这个函数并将0传递给函数时,它的输出是:

Traceback (most recent call last):
  File "/Users/me/Documents/scratchpad/main.py", line 17, in <module>
    print testfunc(x)
  File "/Users/me/Documents/scratchpad/main.py", line 13, in testfunc
    return next(provider for provider in providers if int(provider['id']) == int(id))
StopIteration

Process finished with exit code 1

它确实适用于非零整数。你知道吗


Tags: nameinidforproviderintproviderstestfunc
3条回答

是的,因为你的发电机是空的。你的数据都不匹配

if int(provider['id']) == 0

在空生成器上调用next会抛出StopIteration。你知道吗

字典没有键0的值。它以None的形式查找值,并且无法确定迭代的下一个值。 用有效范围替换代码,代码将正常工作

for x in range(1, 8):
    print( testfunc(x))

您可以添加provider0 = {'id': 0, 'name': 'Onkar'}

providers = [provider0,provider1, provider2, provider3, provider4, provider5, provider6, provider7]使

for x in range(0, 8):
    print( testfunc(x))

工作

这是因为next函数在没有下一个项时引发StopIteration。尤其是当底层迭代器为空时,这是id == 0的情况。你知道吗

相关问题 更多 >