2016-03-02 73 views
0

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

這就是我想到的,但我正在尋找一個更簡單和簡潔的方式。據你所知,有沒有?

+1

您現有的代碼似乎對我好。它絕對可以使用一些更好的名稱選擇,但除此之外,它很簡單直接。 – user2357112

+0

感謝您的提示。你建議什麼名字? –

+0

'_'絕對是一個不錯的選擇。這意味着你放棄了價值。我建議改變它,但是ShadowRanger的建議可以讓你完全擺脫變量。 'swap'表示交換其操作的交換操作,'key'可以提供更多有關未受影響的鍵的信息,但最佳替換選擇將在很大程度上取決於您使用此功能的上下文。看起來你的上下文可能對這個操作有一個有意義的名字。 – user2357112

回答

3

您可以使用確定鍵稍微高明的手段做交換:

a, b = d.keys() - {key} # On Py3; on Python 2.7, you'd use d.viewkeys() 

,但它是一個非常小的「改善」;使用set操作會將更多工作移動到C層,從而避免Python層迭代list的理解,但是當您談論迭代三個值時,差異很小。

它使用KeysView(類似dict的密鑰),以獲取set操作以保留未通過的兩個密鑰。

-1

要解決這個問題,我們首先需要找到與輸入密鑰不相同的兩個密鑰。然後我們交換這些鍵的值。

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 
+1

這對提問者已經擁有的內容並不是真正的改進。 – user2357112

+2

我不希望函數返回'd'。它只需要交換值。 –

+0

我誤解了這個問題。抱歉! –

0

我這個做這種方式,避免使用循環:

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

這涉及重複查找以獲取值;序列拆包是一件好事,應在適當時使用,以避免重複查找相同的值; [DRY(https://en.wikipedia.org/wiki/Don't_repeat_yourself)。 – ShadowRanger

相關問題