Python:根据数组中嵌套字典的条件返回第一个值

Python:根据数组中嵌套字典的条件返回第一个值,python,dictionary,Python,Dictionary,使用嵌套字典创建一些数组: 数据=[{'id':1,'name':'test'},{'id':2,'name':'test'},…,{'id':N,'name':'test'}] 尝试返回第一个id值,其中name=test: 如果x['name']=='test'][0],则数据中x的val=[x['id'] 预期结果:val=1 但有例外:列表索引超出范围 有什么问题吗?使用您稍微编辑的示例数据,您的代码对我来说运行良好: data = [{'id': 1, 'name': 'test'},

使用嵌套字典创建一些数组: 数据=[{'id':1,'name':'test'},{'id':2,'name':'test'},…,{'id':N,'name':'test'}]

尝试返回第一个id值,其中name=test:

如果x['name']=='test'][0],则数据中x的val=[x['id']

预期结果:val=1

但有例外:列表索引超出范围
有什么问题吗?

使用您稍微编辑的示例数据,您的代码对我来说运行良好:

data = [{'id': 1, 'name': 'test'}, {'id': 2, 'name': 'test'}, {'id': 3, 'name': 'test'}]
val = [x['id'] for x in data if x['name'] == 'test'][0]

>>> print(val)
1
但是,如果没有包含与目标字符串匹配的名称的词典:

>>> val = [x['id'] for x in data if x['name'] == 'blah'][0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
解决此问题的一个简单方法是在索引列表之前检查列表:

matches = [x['id'] for x in data if x['name'] == 'test']
val = matches[0] if matches else None
这里假设没有一个不能用作id的值

另一种更有效的方法(再次假设None不是有效id)是使用默认值:

val = next((x['id'] for x in data if x['name'] == 'test'), None)
这将使用生成器表达式,避免生成包含匹配词典的整个列表。相反,它只会在数据列表上迭代,直到找到第一个匹配项,或者数据列表用尽为止

def getFirstMatchingId(data):
    val = [x['id'] for x in data if x['name'] == 'test'] 
    if len(val) >= 1:
        val = val[0]
        print "Matching ID:-->",val

data = [{'id':1, 'name':'test'}, {'id':2, 'name':'test'}, {'id':3, 'name':'test'}]
getFirstMatchingId(data)

data = [{'id':1, 'name':'test1'}, {'id':2, 'name':'test'}, {'id':3, 'name':'test1'}]
getFirstMatchingId(data)

data = [{'id':1, 'name':'test1'}, {'id':2, 'name':'test1'}, {'id':3, 'name':'test1'}]
getFirstMatchingId(data)

data = []
getFirstMatchingId(data)
以上程序将给出输出

匹配ID:->1
匹配ID:->2

请向我们显示完整的回溯。这意味着您的列表中没有名称=='test'的dict。请尝试下一步method@TerryA,这是一个完整的跟踪、行和例外的替代修复方法是将next与生成器表达式一起使用,这也将避免为数据中的x构建潜在的长列表:nextx['id'],如果x['name']='test', None@niemmi:谢谢。看起来我在你评论的时候把这个加在了我的答案上。
def getFirstMatchingId(data):
    val = [x['id'] for x in data if x['name'] == 'test'] 
    if len(val) >= 1:
        val = val[0]
        print "Matching ID:-->",val

data = [{'id':1, 'name':'test'}, {'id':2, 'name':'test'}, {'id':3, 'name':'test'}]
getFirstMatchingId(data)

data = [{'id':1, 'name':'test1'}, {'id':2, 'name':'test'}, {'id':3, 'name':'test1'}]
getFirstMatchingId(data)

data = [{'id':1, 'name':'test1'}, {'id':2, 'name':'test1'}, {'id':3, 'name':'test1'}]
getFirstMatchingId(data)

data = []
getFirstMatchingId(data)