2012-12-02 160 views
1

我是Python新手(一般編程),但是我有一個字典,其中的鍵是元組,並且我想用與列表相同的鍵創建一個新的字典。如何將元組字典轉換爲列表字典(Python)?

這裏就是我的意思:

我:

d = {("apple", "banana", "pear", "pineapple"):24, 
("banana", "pineapple", "apple", "pear"):17, 
("pineapple", "pear", "banana", "apple"):10, 
("apple", "pineapple", "banana", "pear"):16} 

我想:

new_d = {["apple", "banana", "pear", "pineapple"]:24, 
["banana", "pineapple", "apple", "pear"]:17, 
["pineapple", "pear", "banana", "apple"]:10, 
["apple", "pineapple", "banana", "pear"]:16} 

有一個簡單的方法來做到這一點使用的循環和if語句?

+1

列表不能是字典條目的關鍵。 – Matthias

+2

這裏的最終目標是什麼?也許有另一種方法可以解決你當前的問題(因爲我沒有看到問題是什麼)。 –

回答

7

列表不可散列,因此不能是字典中的鍵。

爲什麼你想讓你的密鑰成爲列表?如果您目前正在調用函數

expect_iterable_of_lists(d.keys()) 

,你可以簡單地結合起來maplist

expect_iterable_of_lists(map(list, d.keys())) 
+0

說清單不是*可哈希*因此不能用於基於散列表的字典會更準確。您可以在字典中使用可變鍵,您只需確保突變不會影響以後找到關鍵字的能力。 –

+1

@RaymondHettinger固定。 – phihag

2

正如其他人所指出的,這可能是不使用列表作爲字典鍵是個好主意。

如果這是你真正需要的是,它並不難hashability添加到列表:

>>> class List(list): 
     def __hash__(self): 
      return hash(tuple(self)) 

>>> d = {("apple", "banana", "pear", "pineapple"):24, 
("banana", "pineapple", "apple", "pear"):17, 
("pineapple", "pear", "banana", "apple"):10, 
("apple", "pineapple", "banana", "pear"):16} 

>>> new_d = {List(k):v for k, v in d.items()} 
>>> new_d 
{['banana', 'pineapple', 'apple', 'pear']: 17, 
['apple', 'banana', 'pear', 'pineapple']: 24, 
['pineapple', 'pear', 'banana', 'apple']: 10, 
['apple', 'pineapple', 'banana', 'pear']: 16} 

這個代碼將實現您的使用列表的一個關鍵的目標,它的工作只是罰款只要你不改變列表(基於散列表的字典對於可變鍵不適用)。如果您確實需要更改密鑰,則需要一個不依賴散列的替代字典實現(例如association list)。