Python 如何交换字典中的2个值,给定第3个';钥匙是什么?

Python 如何交换字典中的2个值,给定第3个';钥匙是什么?,python,dictionary,swap,Python,Dictionary,Swap,假设我有三个键的字典'x','y'和'z'。我需要做的是编写一个函数,将'x'作为参数,交换存储在'y'和'z'中的值 def swap(d, key): a, b = [_ for _ in d if _ != key] d[a], d[b] = d[b], d[a] 这就是我想到的,但我正在寻找一种更简单、简洁的方法。就您所知,是否存在任何问题?要解决此问题,我们首先需要找到与输入键不同的两个键。然后,我们只需交换这些键的值 def swap(d, key): key

假设我有三个键的字典
'x'
'y'
'z'
。我需要做的是编写一个函数,将
'x'
作为参数,交换存储在
'y'
'z'
中的值

def swap(d, key):
    a, b = [_ for _ in d if _ != key]
    d[a], d[b] = d[b], d[a]

这就是我想到的,但我正在寻找一种更简单、简洁的方法。就您所知,是否存在任何问题?

要解决此问题,我们首先需要找到与输入键不同的两个键。然后,我们只需交换这些键的值

def swap(d, key):
   keys_to_swap = []
   for k in d:
       if k != key:
           keys_to_swap.append(k)
   # keys_to_swap are the keys that need to be swapped
   # Swap now
   temp = d.get(keys_to_swap[0])
   d[keys_to_swap[0]] = d.get(keys_to_swap[1])
   d[keys_to_swap[1]] = temp
   return d
您最初的答案是正确的,但您没有返回d。 因此,要纠正您的解决方案:

def swap2(d, key):
    a, b = [_ for _ in d if _ != key]
    d[a], d[b] = d[b], d[a]
    return d #Added this line

为了解决这个问题,我们首先需要找到与输入键不同的两个键。然后,我们只需交换这些键的值

def swap(d, key):
   keys_to_swap = []
   for k in d:
       if k != key:
           keys_to_swap.append(k)
   # keys_to_swap are the keys that need to be swapped
   # Swap now
   temp = d.get(keys_to_swap[0])
   d[keys_to_swap[0]] = d.get(keys_to_swap[1])
   d[keys_to_swap[1]] = temp
   return d
您最初的答案是正确的,但您没有返回d。 因此,要纠正您的解决方案:

def swap2(d, key):
    a, b = [_ for _ in d if _ != key]
    d[a], d[b] = d[b], d[a]
    return d #Added this line

通过执行以下操作,可以使用稍微聪明一点的方法来确定要交换的键:

a, b = d.keys() - {key}  # On Py3; on Python 2.7, you'd use d.viewkeys()
但这只是一个很小的“进步”;使用
set
操作将更多的工作转移到C层,避免了对
list
的Python层迭代,但是当您谈论迭代三个值时,差别非常小


它使用一个(类似于
dict
键的活动的
视图)来获得
操作,以保留未传递的两个键。

您可以使用稍微聪明一点的方法来确定要交换的键,方法是:

a, b = d.keys() - {key}  # On Py3; on Python 2.7, you'd use d.viewkeys()
但这只是一个很小的“进步”;使用
set
操作将更多的工作转移到C层,避免了对
list
的Python层迭代,但是当您谈论迭代三个值时,差别非常小


它使用一个(类似于
dict
键的活动
set
视图)来获取
set
操作,以保留未传递的两个键。

我会这样做,以避免使用循环:

def swap(dictS, key):
    keys = list(dictS.keys())
    keys.remove(key)
    dictS[keys[0]], dict[keys[1]] = dictS[keys[1]], dict[keys[0]]

我会这样做,以避免使用循环:

def swap(dictS, key):
    keys = list(dictS.keys())
    keys.remove(key)
    dictS[keys[0]], dict[keys[1]] = dictS[keys[1]], dict[keys[0]]

我觉得你现有的代码不错。它当然可以使用一些更好的名称选择,但除此之外,它简单明了。谢谢你的提示。你建议用什么名字?
\uuu
绝对不是个好选择。这意味着您正在丢弃该值。我建议更改它,但ShadowRanger的建议可以让您完全摆脱变量
swap
建议交换其参数的交换操作,
key
可以更详细地说明它是如何成为未受影响的键,但最佳替换选择在很大程度上取决于使用此函数的上下文。似乎您的上下文对此操作可能有一个有意义的名称。我觉得您现有的代码很好。它当然可以使用一些更好的名称选择,但除此之外,它简单明了。谢谢你的提示。你建议用什么名字?
\uuu
绝对不是个好选择。这意味着您正在丢弃该值。我建议更改它,但ShadowRanger的建议可以让您完全摆脱变量
swap
建议交换其参数的交换操作,
key
可以更详细地说明它是如何成为未受影响的键,但最佳替换选择在很大程度上取决于使用此函数的上下文。似乎您的上下文对此操作可能有一个有意义的名称。与提问者已有的名称相比,这并不是一个真正的改进。我不希望函数返回
d
。它只需要交换值。我误解了这个问题。很抱歉与提问者已有的功能相比,这并不是一个真正的改进。我不希望函数返回
d
。它只需要交换值。我误解了这个问题。很抱歉这涉及重复查找以获取值;序列解包是一件好事,应该在适当的时候使用,以避免重复查找相同的值。这涉及重复查找以获取值;序列解包是一件好事,应该在适当的时候使用,以避免重复查找相同的值。