旋转字典的值
Rotate values of a dictionary
输入:- {34: 'apple', 65: 'ball', 32: 'cat', 78: 'dog'}
输出:- {34: 'dog', 65: 'apple', 32: 'ball', 78: 'cat'}
我想出了以下方法,但是有没有更快的方法来执行此任务?
def rotate_values(my_dict):
keys_list = list(my_dict.keys())
values_list = list(my_dict.values())
values_list.insert(0, values_list.pop())
my_dict = dict(zip(keys_list, values_list))
return my_dict
您的方法是线性的,您无法改进,因为您必须重新绑定每个键。但是,您不必将键转换为列表(zip
将适用于任何可迭代对象),并且您应该使用 deque
进行轮换,因为它支持 O(1)
操作两端因此恒定时间旋转:
from collections import deque
def rotate_values(my_dict):
# no need to cast the keys to list
values_deque = deque(my_dict.values())
values_deque.rotate(1)
return dict(zip(my_dict.keys(), values_deque))
请记住,此过程不是确定性的,因为 dicts
是无序的。重复 len(my_dict)
次不一定会产生原件。
您可以从 my_dict
中获取值并创建一个列表。当您浏览 my_dict
的项目时,您可以将 values
列表中的值分配给 my_dict
项目的值。
my_dict = {34: 'apple', 65: 'ball', 32: 'cat', 78: 'dog'}
values = list(my_dict.values())
i = len(values)-1
for item in my_dict:
my_dict[item] = values[i]
i -= 1
print(my_dict)
这是我的版本:
ks = list(d1.keys()) # [34, 65, 32, 78]
d2 = [d1[x] for x in d1.keys()][::-1] # ['dog', 'cat', 'ball', 'apple']
result = {x[0]:x[1] for x in list(zip(ks,d2))} # {34: 'dog', 65: 'cat', 32: 'ball', 78: 'apple'}
您可以将值解包为最后一个值和其余值,然后将它们重新打包为一个序列,最后一个值在前面:
def rotate_values(my_dict):
if not my_dict:
return {}
*rest, last = my_dict.values()
return dict(zip(my_dict, (last, *rest)))
from collections import deque
def rotate(d, n=1):
"""
@param d: input python dictionary
@param n: number of times to rotate it; default:1
@return do: output dict rotated n times
ex: d = {34: 'apple', 65: 'ball', 32: 'cat', 78: 'dog'}
rotate(d, 1) -> {34: 'dog', 65: 'apple', 32: 'ball', 78: 'cat'}
"""
# Get the values of the dict and put them into a deque collection that contains a rotate method
do = deque(d.values())
do.rotate(n) # rotate the values by n
do = dict(zip(d.keys(), do)) # recombine the keys and values
return do
演示:
In [1]: d = {34: 'apple', 65: 'ball', 32: 'cat', 78: 'dog'}
In [2]: rotate(d)
Out[2]: {34: 'dog', 65: 'apple', 32: 'ball', 78: 'cat'}
您也可以使用迭代器进行循环:
from itertools import chain
def rotate_values(my_dict):
keys = iter(my_dict.keys())
keys = chain(keys, [next(keys)])
return dict(zip(keys, my_dict.values()))
这对我来说是对的,给予:
{65: 'apple', 32: 'ball', 78: 'cat', 34: 'dog'}
如其他地方所述,字典没有排序,因此此代码的实用性值得商榷,但我认为展示另一种解决此问题的方法会很有趣
输入:- {34: 'apple', 65: 'ball', 32: 'cat', 78: 'dog'}
输出:- {34: 'dog', 65: 'apple', 32: 'ball', 78: 'cat'}
我想出了以下方法,但是有没有更快的方法来执行此任务?
def rotate_values(my_dict):
keys_list = list(my_dict.keys())
values_list = list(my_dict.values())
values_list.insert(0, values_list.pop())
my_dict = dict(zip(keys_list, values_list))
return my_dict
您的方法是线性的,您无法改进,因为您必须重新绑定每个键。但是,您不必将键转换为列表(zip
将适用于任何可迭代对象),并且您应该使用 deque
进行轮换,因为它支持 O(1)
操作两端因此恒定时间旋转:
from collections import deque
def rotate_values(my_dict):
# no need to cast the keys to list
values_deque = deque(my_dict.values())
values_deque.rotate(1)
return dict(zip(my_dict.keys(), values_deque))
请记住,此过程不是确定性的,因为 dicts
是无序的。重复 len(my_dict)
次不一定会产生原件。
您可以从 my_dict
中获取值并创建一个列表。当您浏览 my_dict
的项目时,您可以将 values
列表中的值分配给 my_dict
项目的值。
my_dict = {34: 'apple', 65: 'ball', 32: 'cat', 78: 'dog'}
values = list(my_dict.values())
i = len(values)-1
for item in my_dict:
my_dict[item] = values[i]
i -= 1
print(my_dict)
这是我的版本:
ks = list(d1.keys()) # [34, 65, 32, 78]
d2 = [d1[x] for x in d1.keys()][::-1] # ['dog', 'cat', 'ball', 'apple']
result = {x[0]:x[1] for x in list(zip(ks,d2))} # {34: 'dog', 65: 'cat', 32: 'ball', 78: 'apple'}
您可以将值解包为最后一个值和其余值,然后将它们重新打包为一个序列,最后一个值在前面:
def rotate_values(my_dict):
if not my_dict:
return {}
*rest, last = my_dict.values()
return dict(zip(my_dict, (last, *rest)))
from collections import deque
def rotate(d, n=1):
"""
@param d: input python dictionary
@param n: number of times to rotate it; default:1
@return do: output dict rotated n times
ex: d = {34: 'apple', 65: 'ball', 32: 'cat', 78: 'dog'}
rotate(d, 1) -> {34: 'dog', 65: 'apple', 32: 'ball', 78: 'cat'}
"""
# Get the values of the dict and put them into a deque collection that contains a rotate method
do = deque(d.values())
do.rotate(n) # rotate the values by n
do = dict(zip(d.keys(), do)) # recombine the keys and values
return do
演示:
In [1]: d = {34: 'apple', 65: 'ball', 32: 'cat', 78: 'dog'}
In [2]: rotate(d)
Out[2]: {34: 'dog', 65: 'apple', 32: 'ball', 78: 'cat'}
您也可以使用迭代器进行循环:
from itertools import chain
def rotate_values(my_dict):
keys = iter(my_dict.keys())
keys = chain(keys, [next(keys)])
return dict(zip(keys, my_dict.values()))
这对我来说是对的,给予:
{65: 'apple', 32: 'ball', 78: 'cat', 34: 'dog'}
如其他地方所述,字典没有排序,因此此代码的实用性值得商榷,但我认为展示另一种解决此问题的方法会很有趣