假設我有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