如何在Python字典中使用列表作为键
我想用一个字典,格式如下:
例子:{[8, 16]:[[1,2,4,8],8], [16, 24]: [[1,2,3,4,8,12], 12]}
这里的8和16是用户输入的两个数字,我需要构建一个像上面那样的字典。
我可以用setdefault来为字典中的值创建一个列表,但我不知道怎么为键创建列表。
下面是我的代码:
#!/usr/bin/env python
"""
This Program calculates common factors between two Numbers , which
is stored on a list and also greatest common factor is also computed.
All this is stored in a dictionary
Example: { '[n1, n2]': [[Commonfac1(n1,n2), Commonfac2(n1,n2)....Commonfacn(n1,n2)],GreatestCommonFactor] }
"""
def Factors(number):
result = []
for i in range(1, number+1):
if (number % i) == 0:
result.append(i)
return result
def Common_Factors(n1, n2):
result = []
for element in n1:
if element in n2:
result.append(element)
return result
def greatest_common_factor(common_factors):
count = 0
length = len(common_factors)
current_largest = common_factors[count]
for i in common_factors:
count += 1
if count <= length -1:
if current_largest < common_factors[count]:
current_largest = common_factors[count]
return current_largest
def main():
n1 = 8
n2 = 16
result1 = Factors(n1)
result2 = Factors(n2)
CF = Common_Factors(result1, result2)
GCF = greatest_common_factor(CF)
dict = {}
dict.setdefault([n1, n2], []).append(CF)
print dict
if __name__ == '__main__':
main()
当我运行上面的程序时,出现了以下错误:
$ python math74.py
Traceback (most recent call last):
File "math74.py", line 58, in <module>
main()
File "math74.py", line 54, in main
dict.setdefault([n1, n2], []).append(CF)
TypeError: unhashable type: 'list'
有没有什么提示可以帮助我实现这个目标?
再解释一下:{[8, 16]:[[1,2,4,8],8], [16, 24]: [[1,2,3,4,8,12], 12]}
8和16是两个用户输入的数字,1, 2, 4, 8是它们的公因数,而8是它们的最大公因数。
2 个回答
2
如前所述,你可能想把列表转换成元组,这样它就可以被哈希了。
另一种方法,特别是在处理一些更复杂的对象时,可以使用pickle库,它可以把对象进行序列化。
下面是一个例子:
import pickle
my_list = [8, 16]
my_value = 'some_value'
my_dict = {pickle.dumps(my_list): my_value}
my_dict[pickle.dumps([8, 16])] # This equals to 'some_value'
5
列表可能不是你想要的,因为:
1. 列表是可变的。这意味着它可以改变(删除/添加/修改)里面的值。例如:
>>> testList = [1,5]
>>> d = {"myList": testL}
>>> d
{'myList': [1, 5]}
>>> testList.append(53)
>>> d
{'myList': [1, 5, 53]}
>>>
正如你所看到的,列表是可以改变的,并且键需要是唯一的。
对于不可变的数组类型,Python 有一个叫做元组(tuple)的东西。一旦你定义了一个元组,它就不能被修改。这意味着你也可以把它用作字典中的键:
>>> myTuple = (4, 5)
>>> myDict = {myTuple: "here is the value"}
>>> myDict
{(4, 5): 'here is the value'}
>>> myTuple.append(9)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'