我有一个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]之外?
答案 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'}
这将返回元组中包含myKey
和myValue
的元组中的第一个字典,使用list comprehension(删除[0]以获取所有字典)。