2016-03-02 31 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

相关问题