假设我有3个键'x'
,'y'
和'z'
的字典。我需要做的是编写一个函数,给定'x'
作为参数,交换存储在'y'
和'z'
中的值。如何在字典中交换2个值,给定第3个关键字?
def swap(d, key):
a, b = [_ for _ in d if _ != key]
d[a], d[b] = d[b], d[a]
这就是我想到的,但我正在寻找一个更简单和简洁的方式。据你所知,有没有?
假设我有3个键'x'
,'y'
和'z'
的字典。我需要做的是编写一个函数,给定'x'
作为参数,交换存储在'y'
和'z'
中的值。如何在字典中交换2个值,给定第3个关键字?
def swap(d, key):
a, b = [_ for _ in d if _ != key]
d[a], d[b] = d[b], d[a]
这就是我想到的,但我正在寻找一个更简单和简洁的方式。据你所知,有没有?
您可以使用确定键稍微高明的手段做交换:
a, b = d.keys() - {key} # On Py3; on Python 2.7, you'd use d.viewkeys()
,但它是一个非常小的“改善”;使用set
操作会将更多工作移动到C层,从而避免Python层迭代list
的理解,但是当您谈论迭代三个值时,差异很小。
它使用KeysView
(类似dict
的密钥),以获取set
操作以保留未通过的两个密钥。
要解决这个问题,我们首先需要找到与输入密钥不相同的两个密钥。然后我们交换这些键的值。
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(dictS, key):
keys = list(dictS.keys())
keys.remove(key)
dictS[keys[0]], dict[keys[1]] = dictS[keys[1]], dict[keys[0]]
这涉及重复查找以获取值;序列拆包是一件好事,应在适当时使用,以避免重复查找相同的值; [DRY(https://en.wikipedia.org/wiki/Don't_repeat_yourself)。 – ShadowRanger
您现有的代码似乎对我好。它绝对可以使用一些更好的名称选择,但除此之外,它很简单直接。 – user2357112
感谢您的提示。你建议什么名字? –
'_'绝对是一个不错的选择。这意味着你放弃了价值。我建议改变它,但是ShadowRanger的建议可以让你完全摆脱变量。 'swap'表示交换其操作的交换操作,'key'可以提供更多有关未受影响的键的信息,但最佳替换选择将在很大程度上取决于您使用此功能的上下文。看起来你的上下文可能对这个操作有一个有意义的名字。 – user2357112