Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表理解失败,但为什么?_Python - Fatal编程技术网

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

Python 列表理解失败,但为什么?,python,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'} provi

谁能向我解释为什么这份清单理解失败:

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
回溯(最近一次呼叫最后一次):
文件“/Users/me/Documents/scratchpad/main.py”,第17行,在
打印testfunc(x)
testfunc中第13行的文件“/Users/me/Documents/scratchpad/main.py”
返回next(如果int(provider['id'])==int(id),则provider中的provider的provider为provider)
停止迭代
进程已完成,退出代码为1

它对非零整数有效。

这是因为
next
函数在没有下一项时引发
StopIteration
。特别是当基础迭代器为空时,这是您的
id==0

情况,这是因为
next
函数在没有下一项时引发
StopIteration
。尤其是当基础迭代器为空时,这是您的
id==0

情况,字典没有键
0
的值。它发现值为
None
,无法确定迭代的下一个值。 用有效范围替换代码,代码将正常工作

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

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

providers=[provider 0、provider 1、provider 2、provider 3、provider 4、provider 5、provider 6、provider 7]
以使

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

work

字典没有键
0
的值。它发现值为
None
,无法确定迭代的下一个值。 用有效范围替换代码,代码将正常工作

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

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

providers=[provider 0、provider 1、provider 2、provider 3、provider 4、provider 5、provider 6、provider 7]
以使

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

工作

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

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

在空生成器上调用
next
会抛出
StopIteration

是,因为生成器是空的。您的数据都不匹配

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

在空生成器上调用
next
会抛出
StopIteration

Ok,这当然是合乎逻辑的。因此,这意味着这种方法在这种情况下是危险的,在这种情况下,for循环迭代提供程序将是更好的选择。谢谢大家!不太危险。您只需将
下一个
调用包装为
try:。。。除了停止迭代:…
块。你所要做的就是在给定的标准中没有项目的情况下找出你想要的东西。没错,我想这样做是因为其他地方写的,这种方法要快得多。但是如果你
尝试
并捕获
停止迭代
,我想知道你是否还能获得任何东西,我会不会让它比
对于
提供者
使用
if int(提供者['id')==int(id)
返回提供者
更复杂。。。我来检查一下。结果是,同样符合逻辑,如果您希望抛出大量异常,那么最好使用for循环。如果你有一个大的列表,很少有例外,你最好有一个理解结构!如果您可以保证
id
在每个对象上都是唯一的,那么就有了一个更简单的解决方案。只需将列表转换为字典
{id:object}
。然后搜索是
O(1)
,而列表的搜索是
O(n)
。这就是索引的基本工作原理。好的,这当然是合乎逻辑的。因此,这意味着这种方法在这种情况下是危险的,在这种情况下,for循环迭代提供程序将是更好的选择。谢谢大家!不太危险。您只需将
下一个
调用包装为
try:。。。除了停止迭代:…
块。你所要做的就是在给定的标准中没有项目的情况下找出你想要的东西。没错,我想这样做是因为其他地方写的,这种方法要快得多。但是如果你
尝试
并捕获
停止迭代
,我想知道你是否还能获得任何东西,我会不会让它比
对于
提供者
使用
if int(提供者['id')==int(id)
返回提供者
更复杂。。。我来检查一下。结果是,同样符合逻辑,如果您希望抛出大量异常,那么最好使用for循环。如果你有一个大的列表,很少有例外,你最好有一个理解结构!如果您可以保证
id
在每个对象上都是唯一的,那么就有了一个更简单的解决方案。只需将列表转换为字典
{id:object}
。然后搜索是
O(1)
,而列表的搜索是
O(n)
。这基本上就是索引的工作方式。