Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
List python帮助从列表中提取值_List_Dictionary_Python - Fatal编程技术网

List python帮助从列表中提取值

List python帮助从列表中提取值,list,dictionary,python,List,Dictionary,Python,我想从列表中提取密钥id等于16的字典 有没有一种更像蟒蛇的方式 提前感谢这就够了。它是否干净是个人的事 lst = [{"id": 1, "name": "ernest"}, .... {"id": 16, name:"gellner"}] for d in lst: if "id" in d and d["id"] == 16: return d 如果没有id为0的字典,此初始方法将失败。您可以这样克服这个问题: d16 = [d for d in lst if

我想从列表中提取密钥id等于16的字典

有没有一种更像蟒蛇的方式


提前感谢

这就够了。它是否干净是个人的事

lst = [{"id": 1, "name": "ernest"}, .... {"id": 16, name:"gellner"}]

for d in lst:
    if "id" in d and d["id"] == 16:
        return d
如果没有id为0的字典,此初始方法将失败。您可以这样克服这个问题:

d16 = [d for d in lst if d.get('id', 0) == 16][0]

这将防止索引错误,但如果容器中没有符合条件的词典,d16将是一个空列表。

这样做。它是否干净是个人的事

lst = [{"id": 1, "name": "ernest"}, .... {"id": 16, name:"gellner"}]

for d in lst:
    if "id" in d and d["id"] == 16:
        return d
如果没有id为0的字典,此初始方法将失败。您可以这样克服这个问题:

d16 = [d for d in lst if d.get('id', 0) == 16][0]

这将防止索引错误,但如果容器中没有符合条件的词典,d16将是一个空列表。

如果没有找到,则有一点改进:

d16 = [d for d in lst if d.get('id', 0) == 16]
if d16: d16 = d16[0]

如果没有发现,则有一个轻微的改进:

d16 = [d for d in lst if d.get('id', 0) == 16]
if d16: d16 = d16[0]

在现有答案上翻找,以摆脱评论:

如果只需要序列中的第一个匹配元素,请考虑使用生成器表达式:

d16 = ([d for d in lst if d.get('id', 0) == 16] + [None])[0]
这是您在我的代码中经常看到的模式。如果发现lst中没有任何符合条件的项,这将引发StopIteration。当预期会发生这种情况时,您可以捕获异常:

d16 = (d for d in lst if d.get('id') == 16).next()
或者更好的办法是,将整个过程展开成一个for循环,然后停止


else:子句仅在for循环耗尽其输入时才运行,但如果for循环结束,则会跳过该子句,因为使用了break来对现有答案进行重新整理以从注释中删除:

如果只需要序列中的第一个匹配元素,请考虑使用生成器表达式:

d16 = ([d for d in lst if d.get('id', 0) == 16] + [None])[0]
这是您在我的代码中经常看到的模式。如果发现lst中没有任何符合条件的项,这将引发StopIteration。当预期会发生这种情况时,您可以捕获异常:

d16 = (d for d in lst if d.get('id') == 16).next()
或者更好的办法是,将整个过程展开成一个for循环,然后停止



else:子句只有在for循环耗尽其输入时才会运行,但如果for循环结束,因为使用了break,则会跳过它

请注意,如果lst中没有id值为16的字典,这可能会生成一个索引器。如果我在“d.getid,0”之前添加“if d[id]”,该怎么办?@shookan-d.get[,]已经处理好了。问题不在列表理解中,而是在它后面的[0]中-如果列表理解生成一个空列表,因为没有字典具有id 0,那么尝试检索结果列表的位置0将引发错误。嗯,我知道了。所以我想我应该在try-catch阵营中使用这句话?@Shaokan-上面稍微修改一下。HTH.请注意,如果lst中没有id值为16的字典,这可能会生成索引器。那么,如果我在“d.getid,0”之前添加“if d[id]”,该怎么办?@shookan-d.get[,]已经解决了这个问题。问题不在列表理解中,而是在它后面的[0]中-如果列表理解生成一个空列表,因为没有字典具有id 0,那么尝试检索结果列表的位置0将引发错误。嗯,我知道了。所以我想我应该在try-catch阵营中使用这句话?@Shaokan-上面稍微修改一下。嗯。@MacGuy嗯,是的,我实际上是指16岁,我只是没有注意到我会编辑它,我认为这已经足够好了。任何更多的事情都会使事情变得过于复杂。有没有理由把它列在一个清单上?因为我想说,最具python风格的解决方案是使用不同的数据结构。像这样查询列表总是低效的。除非你有明确的理由需要一个字典列表,否则我建议你使用一个字典字典。@senderle我正在构建一个节点树,这就是为什么我必须使用列表,因为字典没有排序:@TokenMacGuy是的,我实际上是指16,我只是没有注意到我会编辑它。我认为这足够好。任何更多的事情都会使事情变得过于复杂。有没有理由把它列在一个清单上?因为我想说,最具python风格的解决方案是使用不同的数据结构。像这样查询列表总是低效的。除非有明确的理由需要字典列表,否则我建议使用字典字典。@senderle我正在构建一个节点树,这就是为什么我必须使用列表,因为字典没有排序:我只是测试了@g.d.d.c的答案,并将其与我的答案进行了比较。有一个巨大的性能差异。在列表中使用一百万个字典进行测试,他的方法在0.20秒内返回一个值,而我在问题中提供的方法仅在0.01秒内返回。我做错了什么,还是它实际上是真的?现在情况发生了变化,你的生成器表达式和我的一样快,只有一行。当您从包含从0到100万id的列表中搜索id 999时,它会在0.01秒内返回值,因此基本上
和我的一样。但问题是,如果你不介意的话,试着抓住它仅有的一句话。因此,我将把我的答案从gddc转到你的!谢谢从严格的效率角度来看,您的原始解决方案唯一可以使用的是将d.get'id'==16替换为d中的'id',d['id']==16。否则,你的速度应该更快。通常情况下,像更像蟒蛇的问题会导致答案在某种程度上是聪明的,但并不总是尽可能有效地解决我的问题。小心你的要求。我刚刚测试了@g.d.d.c的答案,并将其与我的答案进行了比较。有一个巨大的性能差异。在列表中使用一百万个字典进行测试,他的方法在0.20秒内返回一个值,而我在问题中提供的方法仅在0.01秒内返回。我做错了什么,还是它实际上是真的?现在情况发生了变化,你的生成器表达式和我的一样快,只有一行。当您从包含从0到100万id的列表中搜索id 999时,它会在0.01秒内返回值,因此基本上与我的相同。但问题是,如果你不介意的话,试着抓住它仅有的一句话。因此,我将把我的答案从gddc转到你的!谢谢从严格的效率角度来看,您的原始解决方案唯一可以使用的是将d.get'id'==16替换为d中的'id',d['id']==16。否则,你的速度应该更快。通常情况下,像更像蟒蛇的问题会导致答案在某种程度上是聪明的,但并不总是尽可能有效地解决我的问题。小心你的要求。