Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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
根据dict键从dict列表中选择一个条目是最具Python风格的吗?_Python_Python 3.x_Dictionary_List Comprehension - Fatal编程技术网

根据dict键从dict列表中选择一个条目是最具Python风格的吗?

根据dict键从dict列表中选择一个条目是最具Python风格的吗?,python,python-3.x,dictionary,list-comprehension,Python,Python 3.x,Dictionary,List Comprehension,假设我有AllData,一个嵌套dict的列表(假设有数千个条目),但我只寻找一个条目 AllData = [ { "EntryA" : {"A Key":"A Value"} }, { "EntryB" : {"B Key":"B Value"} }, { "EntryC" : {"C Key":"C

假设我有AllData,一个嵌套dict的列表(假设有数千个条目),但我只寻找一个条目

AllData = [
    { "EntryA" : {"A Key":"A Value"} },
    { "EntryB" : {"B Key":"B Value"} },
    { "EntryC" : {"C Key":"C Value"} }
]
目前,我只是循环通过它,并打破一旦我找到匹配的关键

MyKey = "EntryB"
FoundData = {}
for item in AllData:
    for key,data in item.items():
        if MyKey.lower() == key.lower():
            FoundData = data
            break
print(FoundData)
然而,作为一名Python爱好者,我知道有一种更优雅的方法可以做到这一点。我在正确的列表理解技巧上有些困难,但我正在努力!下面是我所能想到的最好的方法,它在一行中收集这些数据,但我想知道是否有一个更优雅的解决方案来解决这个问题

MyKey = "EntryB"    
FoundData = [x for x in AllData if str(list(x.items())[0][0]).lower() == MyKey.lower()][0][MyKey]
print(FoundData)

如果您使用的是Python 3.8+,您可以将赋值表达式(
:=
)和
Any()
Any()
在找到第一个有效元素时将中断)组合在一起:

印刷品:

{'EntryB': {'B Key': 'B Value'}}
您可以使用
filter()
,根据MyKey的内容,它的外观如下:

AllData = [
    { "EntryA" : {"A Key":"A Value"} },
    { "EntryB" : {"B Key":"B Value"} },
    { "EntryC" : {"C Key":"C Value"} }
]
MyKey = "EntryB"
found = list(filter(lambda x: MyKey in x.keys(), AllData))[0][MyKey]
print(found)

我不认为列表理解是合适的方法,因为你只想要第一场比赛

所有_数据=[
{“EntryA”:{“A Key”:“A Value”},
{“EntryB”:{“B键”:“B值”},
{“EntryC”:{“C键”:“C值”}
]
target_key=“EntryB”
已找到\u数据=无
对于所有数据中的当前记录:
如果找到数据:=当前指令获取(目标键):
打破
打印(已找到数据)
我仍然不能完全确定在这里使用赋值表达式是否值得,这可能会使它更难理解

以下是不带赋值表达式的版本:

所有_数据=[
{“EntryA”:{“A Key”:“A Value”},
{“EntryB”:{“B键”:“B值”},
{“EntryC”:{“C键”:“C值”}
]
target_key=“EntryB”
已找到\u数据=无
对于所有数据中的当前记录:
当前数据=当前指令获取(目标键)
如果当前数据不是无:
找到的数据=当前数据
打破
打印(已找到数据)

< /代码>如果你关心的是Pythonic,你应该考虑改变一些变量名(当然,如果你不受现有项目的风格限制),你可以使用 Fielter()/<代码>,这不是非常的Pythic,而lambda是必要的,这可能是一个指示:
在这里不是正确的选择。1)我明白你关于var名称的意思,我会记住:)2)我以前从未见过或至少理解过:=赋值表达式,现在我有一整天的阅读时间,因为我真的不明白那里发生了什么。因此,谢谢你:P@Auscoi请参见编辑,我添加了一个没有赋值表达式的解决方案。你能思考一下列表理解问题吗?不幸的是,我正在使用Python3.6,但我刚刚从这篇文章中学习了赋值表达式,所以我将阅读这篇文章,赶快!为此使用列表理解(或生成器表达式)有什么意义?
AllData = [
    { "EntryA" : {"A Key":"A Value"} },
    { "EntryB" : {"B Key":"B Value"} },
    { "EntryC" : {"C Key":"C Value"} }
]
MyKey = "EntryB"
found = list(filter(lambda x: MyKey in x.keys(), AllData))[0][MyKey]
print(found)