繁体   English   中英

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

[英]Retrieve data from nested tuple-dictionary structure using Python 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]?

最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"

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

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

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

如果你有一个名为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'}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM