我有以下词典:
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"])
答案 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")
运行此代码时,您可以在屏幕上看到“伊朗人”