1

我是 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}

有没有一种简单的方法可以使用 for 循环和 if 语句来做到这一点?

4

2 回答 2

7

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

为什么你希望你的键是列表?如果您当前正在调用一个函数

expect_iterable_of_lists(d.keys())

, 你可以简单地结合maplist:

expect_iterable_of_lists(map(list, d.keys()))
于 2012-12-02T19:02:21.293 回答
2

正如其他人所指出的,将列表用作字典键可能不是一个好主意。

如果这是您真正需要的,那么向列表添加哈希性并不难:

>>> 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}

此代码将实现您使用列表键的目标,只要您不改变列表(基于哈希表的字典不适用于可变键),它就可以正常工作。如果确实需要改变键,则需要一个不依赖散列的替代字典实现(例如关联列表)。

于 2012-12-02T19:39:47.173 回答