字典,其中键是Python中的整数对

时间:2012-11-14 08:30:11

标签: python string performance dictionary tuples

如何在Python中创建一个字符,其中键是整数对?

例如,如果我这样做:

mydict=dict()
mydict[ [1,2] ] = 'xxx'

我收到错误TypeError: unhashable type: 'list'

所以我提出了两种不同的解决方案:字符串或元组作为键。

第一个解决方案似乎是在字符串表示中转换整数对:

mydict=dict()
mydict[ str(1)+" "+str(2) ] = 'xxx'

而第二个解决方案涉及元组:

mydict=dict()
mydict[ tuple([1,2]) ] = 'xxx'

从一些实验中我发现元组解决方案比字符串解决方案慢。 是否有一种更有效,更快速的方法,只使用两个整数作为键?

1 个答案:

答案 0 :(得分:14)

你应该使用一个可以散列的元组:

mydict = {}
mydict[(1, 2)] = 'xxx'
# or more concisely (@JamesHenstridge):
mydict[1,2] = 'xxx'

如果那实际上太慢(不要不必要地进行优化),那么给定一个整数的最大值,构造一个索引:

def index(a, b, maxB):
    return a*maxB + b

mydict[index(1, 2, max)] = 'xxx'

但请注意,函数调用可以轻松地进一步降低速度,因此您可以以可读性为代价内联函数,并且如果在其他位置复制粘贴,则更容易引入错误:

mydict[1*max + 2] = 'xxx'

顺便提一下,对于带有元组键的词典的读取速度存在一个问题:

Python tuples as keys slow?

进行一些分析显示内联索引比元组略快(<5%),并且两者的速度都是索引的两倍。如果这是在PyPy中完成的,我希望索引版本(内联或不内联)更快。

在附属说明中;如果你担心dict的插入速度,你可能使用了错误的数据结构,或者可能做了比必要更多的工作。例如,将CSV文件解析为每行中的字段并将这些值以这种方式存储在dict中data[line,field]可能是不必要的,如果你可以使行解析延迟并只解析实际从中提取数据的行。即如果可以data = parseAll(somecsv); print data[7,'date'],请不要dataLines = somecsv.readlines(); print getField(dataLines[7], 'date')