在玩输入验证时,具体检查提供的数据是否具有指定的所有必需属性,并丢弃我不想要的属性,我做了类似的事情:
>>> 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在哪里获得这些值?
答案 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
,其中一个v
,a
,l
和2
被选中,而其他人则被丢弃。词典理解首先设置'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 }