Python Dictionary comprehension将一些对复制到一个新的字典中

时间:2014-12-12 16:15:42

标签: python python-2.7 dictionary dictionary-comprehension

在玩输入验证时,具体检查提供的数据是否具有指定的所有必需属性,并丢弃我不想要的属性,我做了类似的事情:

>>> input = {'v1': 'val1', 'a2':'val2', 'a3':'val3'} 
>>> print input
{'v1': 'val1', 'a3': 'val3', 'a2': 'val2'}
>>> goodkeys = ['a2', 'a3']
>>> print goodkeys
['a2', 'a3']
>>> output = {}
>>> for a in goodkeys:    
...   output[a] = input[a]
... 
>>> 
>>> print output
{'a3': 'val3', 'a2': 'val2'}

当然有效。但在我看来,有可能以更加pythonic的方式做到这一点。我试过了:

>>> output = {}
>>> print output
{}
>>> output = { a:v for a in goodkeys for v in input[a] }
>>> print output
{'a3': '3', 'a2': '2'}
>>> 

在我认为工作的半秒钟之后,我意识到价值观是错误的。有一个漂亮的Python方法吗?发生了什么,Python在哪里获得这些值?

3 个答案:

答案 0 :(得分:3)

您可以使用dictionary view objects

goodkeys = {'a2', 'a3'}
output = {a: input[a] for a in input.viewkeys() & goodkeys}

其中goodkeys是一个集合; dict.viewkeys()生成一个反映字典内容的类似集合的对象,& goodkeys生成这些键与goodkeys集之间的交集。这样,您只能生成输入字典和一组好键中的键。

你创建了一个这样的嵌套循环:

for a in goodkeys:
    for v in input[a]:
        # v is a single character in the string value

演示:

>>> input = {'v1': 'val1', 'a2':'val2', 'a3':'val3'} 
>>> goodkeys = {'a2', 'a3'}
>>> {a: input[a] for a in input.viewkeys() & goodkeys}
{'a3': 'val3', 'a2': 'val2'}

由于input[a]是一个字符串,因此你的内部循环产生了每个值的各个字符:

>>> for a in goodkeys:
...     for v in input[a]:
...         print a, v
... 
a3 v
a3 a
a3 l
a3 3
a2 v
a2 a
a2 l
a2 2

密钥必须是唯一的,因此对于a2,其中一个val2被选中,而其他人则被丢弃。词典理解首先设置'a2': 'v',然后设置'a2': 'a'等等,最后只有'a2': '2'保留在输出中。

你不需要使用那个内循环;你可能会坚持:

{a: input[v] for a in goodkeys}

除非goodkeys中的任何键不在input中,否则您将获得KeyError。字典视图方法巧妙地回避了这个问题。

答案 1 :(得分:0)

output = { a:input[a] for a in goodkeys }

您的第二个for遍历字符串值的字符。

答案 2 :(得分:0)

你可能在想这个。试试改变

output = { a:v for a in goodkeys for v in input[a] }

简单地......

output = { a:input[a] for a in goodkeys }