3

我有一个 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

现在是使用嵌套推导的时候吗?那会是什么样子,在这一点上用循环和条件写出来会更简单吗?

另外,附带的问题 - 除了在末尾拍打 [0] 之外,是否有更 Pythonic 的方式来获取列表中的第一个(或唯一的)元素?

4

3 回答 3

2

最pythonic的方法是使用next()

通过调用其 next() 方法从迭代器中检索下一项。如果给出默认值,则在迭代器耗尽时返回,否则引发 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"
于 2013-09-24T10:51:17.927 回答
1

但是为什么接下来呢?只需使用生成器。我会这样做(alecxe 的代码稍作改动):

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

result = [data[x] for x in data if data[x] == myValue]
于 2013-09-24T10:55:00.240 回答
1

如果您有一个名为 data 的字典元组,您可以执行以下操作:

>>> 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使用列表理解的第一个字典(删除 [0] 以获取所有字典)。

于 2013-09-24T11:01:25.300 回答