列表的python词典

时间:2016-05-04 18:03:10

标签: python list dictionary

我有以下词典:

items_temp = dict(fruits=["apple", "orange"], vegetables=["carrot", "potato"], animals=["dog", "cat"])

以及以下列表,以验证它包含的内容。

check = ["orange", "dog", "apple"]

是否有任何聪明的pythonic方法从上面的数据中获取以下dict?:

output = dict(fruits = ["orange", "apple"], animals=["dog"])

3 个答案:

答案 0 :(得分:2)

我认为你应该能够做到以下几点:

check = set(['orange', 'dog', 'apple'])
output = {k: check.intersection(v) for k, v in items_temp.items() if check.intersection(v)}

基本上,我正在检查check与字典值之间的交集。如果一个交集,我们将它添加到输出中。

这将为您提供一个字符集,其中包含值作为值,但您可以非常轻松地转换它。

请注意,我们两次进行交叉检查。如果我们在处理管道中添加一个额外的步骤,那有点烦人(我们绝对不需要)...

check = set(['orange', 'dog', 'apple'])
keys_intersect = ((k, check.intersection(v)) for k, v in items_temp.iteritems())
output = {k: intersect for k, intersect in keys_intersect if intersect}

答案 1 :(得分:0)

没有一个干净,单步的方式来获得你想要的东西,但你可以做到两个:

>>> output = {k:[v for v in vs if v in check] for k,vs in items_temp.items()}
>>> output
{'vegetables': [], 'animals': ['dog'], 'fruits': ['apple', 'orange']}

接下来,我们只需要过滤掉空列表:

>>> output = {k:vs for k,vs in output.items() if vs}
>>> output
{'animals': ['dog'], 'fruits': ['apple', 'orange']}

如果你有很多要检查的项目,你可以通过将check变成set来大大加快速度,但过早优化是所有邪恶的根源

编辑:我想你可以在一个地方做到这一点:

>>> output = {k:[v for v in vs if v in check] for k,vs in items_temp.items() if any(v in check for v in vs)}
>>> output
{'animals': ['dog'], 'fruits': ['apple', 'orange']}

但是这会使冗余测试过于复杂化。

您也可以

{k:vs for k,vs in ((k,[v for v in vs if v in check]) for k,vs in items_temp.items()) if vs}

要在没有冗余成员资格检查的情况下一步完成,但现在我们变得有点傻了。

答案 2 :(得分:-4)

你为什么不用字典?

a={"Mobin":"Iranian","Harry":"American"}

你可以用这个来解决这个问题:

print a.get("Mobin")

运行此代码时,您可以在屏幕上看到“伊朗人”