【发布时间】:2016-10-27 12:52:47
【问题描述】:
我想转换 Python 字典的所有键。
例如,如果键是整数,我想将每个键更改为原始值乘以 100。
实现这一目标的最高效的方法是什么?
我现在的做法是将原始密钥存储在 set 中并删除这些密钥,用新密钥替换它们 - 如果我有一个 key=2 和一个 key=200在原始密钥集中,会有冲突,我必须递归处理,直到找到与原始密钥集没有冲突的密钥。
【问题讨论】:
标签: python python-2.7
我想转换 Python 字典的所有键。
例如,如果键是整数,我想将每个键更改为原始值乘以 100。
实现这一目标的最高效的方法是什么?
我现在的做法是将原始密钥存储在 set 中并删除这些密钥,用新密钥替换它们 - 如果我有一个 key=2 和一个 key=200在原始密钥集中,会有冲突,我必须递归处理,直到找到与原始密钥集没有冲突的密钥。
【问题讨论】:
标签: python python-2.7
您可以使用字典推导:
>>> d = {1: 'a', 2: 'b', 3: 'c'}
>>> {k*100: v for k, v in d.items()}
{200: 'b', 300: 'c', 100: 'a'}
如果您使用的是 Python 2,请将 items() 替换为 iteritems()。
【讨论】:
我会为此使用dict comprehession。
result = {your_func(key): value for key, value in your_dict.iteritems()}
【讨论】:
your_dict.items()
要添加在 Python 2.7 和 Python 3.x 中同样有效的 dict 理解答案:
{ your_func(key): your_dict[key] for key in your_dict }
它甚至比 items/iteritems 快一点(至少在我的琐碎测试中;确定你的代码)。
# Python 2
>>> timeit.timeit( '{2*x: y for x,y in d.iteritems()}', 'd={1:2, 2:4}')
0.4100990295410156
>>> timeit.timeit( '{2*x: d[x] for x in d}', 'd={1:2, 2:4}')
0.38503098487854004
# Python 3
>>> timeit.timeit( '{2*x: y for x,y in d.items()}', 'd={1:2, 2:4}')
0.5370963809546083
>>> timeit.timeit( '{2*x: d[x] for x in d}', 'd={1:2, 2:4}')
0.4837625279906206
【讨论】:
(iter)items()
items() 也更快
items();在这两种情况下,您都在遍历一个迭代器,因此随着 dict 的大小增加,比率应该接近 1。我说它更快的评论有点半开玩笑。