旋转字典的值

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'}

如其他地方所述,字典没有排序,因此此代码的实用性值得商榷,但我认为展示另一种解决此问题的方法会很有趣