使用Python list-comprehension从嵌套的tuple-dictionary结构中检索数据

时间:2013-09-24 10:44:29

标签: python dictionary tuples list-comprehension

我有一个n元组的词典。我想从这个包含特定键值对的元组中检索字典。

我试图尽可能优雅地做到这一点,我认为列表理解是要走的路 - 但这不是一个基本的列表理解,我有点迷失。

这显示了我正在尝试做的事情的想法,但它当然不起作用:

# 'data' is my n-tuple
# 'myKey' is the key I want
# 'myValue is the value I want

result = [data[x] for dictionary in data if (data[x][myKey]) == myValue)][0]

# which gives this error:

NameError: global name 'x' is not defined

之前,我正在尝试这样的事情(错误是有道理的,我明白了):

result = [data[x] for x in data if (data[x][myKey] == myValue)][0]

# which gives this error:

TypeError: tuple indices must be integers, not dict

这是使用嵌套理解的时候了吗?看起来会是什么样的,那么用循环和条件语写出它会更简单吗?

另外,旁边的问题 - 是否有更多的pythonic方法来获取列表中的第一个(或唯一的)元素,除了在末尾打[0]之外?

3 个答案:

答案 0 :(得分:2)

最pythonic的方式是使用next()

  

通过调用next()方法从迭代器中检索下一个项目。   如果给出了default,则在迭代器耗尽时返回,   否则会引发StopIteration。

data = ({'1': 'test1'}, {'2': 'test2'}, {'3': 'test3'})
myKey = '2'
myValue = 'test2'

print next(x for x in data if x.get(myKey) == myValue)  # prints {'2': 'test2'}

如果找不到该项目,您还可以指定默认值:

myKey = 'illegal_key'
myValue = 'illegal_value'

print next((x for x in data if x.get(myKey) == myValue), 
           'No item found')  # prints "No item found"

答案 1 :(得分:1)

但接下来呢? 只需使用发电机。我会这样做(来自alecxe的一些改动的代码):

data = ({'1': 'test1'}, {'2': 'test2'}, {'3': 'test3'})
myKey = '2'
myValue = 'test2'

result = [data[x] for x in data if data[x] == myValue]

答案 2 :(得分:1)

如果您有一组名为数据的词典,您可以这样做:

>>> data = ({'fruit': 'orange', 'vegetable':'lettuce'}, {'football':'arsenal', 'basketball':'lakers'}, {'england':'london', 'france':'paris'} )
>>> myKey = "football"
>>> myValue = "arsenal"
>>> [d for d in data if (myKey, myValue) in d.items()][0]
 {'basketball': 'lakers', 'football': 'arsenal'}

这将返回元组中包含myKeymyValue的元组中的第一个字典,使用list comprehension(删除[0]以获取所有字典)。