2011-07-21 74 views
1

說我有一本字典詞典,具有以下值:的Python:修改一個字典,使該鍵的值,和值的鍵

dict1 = {'1': ['a','b', 'c', 'd'], '2': ['e','f', 'g', 'h']} 

我怎麼會做值中的一個關鍵一個新的詞典,dict1?

dict2 = {'d': ['a','b', 'c', '1'], 'h': ['e','f', 'g', '2']} 
+0

哪個值應成爲關鍵? – Patrick

+0

@Patrick:值列表中的最後一個變量。 – user725236

+0

dict是內建的,你不應該把它用作變量名。 –

回答

7
In [12]: d = {'1': ['a','b', 'c', 'd'], '2': ['e','f', 'g', 'h']} 

In [13]: dict((v[-1],v[:-1]+[k]) for k,v in d.iteritems()) 
Out[13]: {'d': ['a', 'b', 'c', '1'], 'h': ['e', 'f', 'g', '2']} 

k是原始密鑰,v是原始值(列表)。結果,v[-1]成爲新密鑰,v[:-1]+[k]成爲新值。

編輯正如Adrien Plisson指出的那樣,Python 3不支持iteritems。此外,在Python 2.7+和3,可以使用字典解析:

{v[-1]: v[:-1]+[k] for k,v in d.items()} # Python 2.7+ 
+0

python3 syntax:'{v [-1]:v [: - 1] + [k] for k,v in d.items()}' –

+0

@Adrien Plisson:Thanks for this。我已經更新了答案。 – NPE

+0

更好的Python 2.7語法:'{v [-1]:v [: - 1] + [k] for k,v in d.iteritems()}' – martineau

0

使該鍵的值,和值的鍵:

dict2 = dict((dict1[key], key) for key in dict1) 

dict2 = dict((value,key) for key, value in dict1.items()) 

兩者都適用於所有版本的Python。


特例

只有在問題這不工作的例子的特殊情況,因爲列表不能用作鍵。因此,使用每個列表作爲關鍵的最後一個元素,並與以前的鑰匙替換最後這個問題,我們得到了更復雜:

dict2 = dict((dict1[key][-1], dict1[key][:-1]+[key]) for key in dict1) 

注意,在Python 3.0,dict.iterkeys(), dict.itervalues(), and dict.iteritems()不再有效。 dict.keys(), dict.values(), and dict.items()都行。只需迭代一個字典(如for key over dict1)即可返回密鑰列表。通常使用的是分類鍵在

keys = sorted(mydict) 
+0

'dict((dict1 [key],key)for key在dict1)'我認爲這使得一個額外的值查找 – warvariuc

+0

'的關鍵字dict'不應該查找任何值,所以該值只被查找一次:在dict1 [key]中。避免使用.items()使得代碼稍微「更清潔」,便於閱讀。 – Remi

+0

是的,我認爲你是對的 - 它確實值得查看一次。但是,在迭代鍵值對時,Python仍然可能會進行一些優化。但在這種情況下:'dict((dict1 [key] [ - 1],dict1 [key] [: - 1] + [key])在dict1)中查找兩次。 – warvariuc

0

而另一種方法:

dict1 = {'1': ['a','b', 'c', 'd'], '2': ['e','f', 'g', 'h']} 
dict2 = {} 

for k in dict1: 

    dict2[dict1[k][-1]]= dict1[k] 
    dict2[dict1[k][-1]][-1] = k 

print dict2  #{'h': ['e', 'f', 'g', '2'], 'd': ['a', 'b', 'c', '1']}