Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中键是一对整数的字典_Python_String_Performance_Dictionary_Tuples - Fatal编程技术网

Python中键是一对整数的字典

Python中键是一对整数的字典,python,string,performance,dictionary,tuples,Python,String,Performance,Dictionary,Tuples,在Python中,如何创建键为整数对的字典 例如,如果我这样做: mydict=dict() mydict[ [1,2] ] = 'xxx' 我得到了错误TypeError:unhabable类型:“list” 所以我提出了两种不同的解决方案:字符串或元组作为键 第一种解决方案似乎是转换字符串表示形式中的整数对: mydict=dict() mydict[ str(1)+" "+str(2) ] = 'xxx' 第二种解决方案涉及元组: mydict=dict() mydict[ tuple

在Python中,如何创建键为整数对的字典

例如,如果我这样做:

mydict=dict()
mydict[ [1,2] ] = 'xxx'
我得到了错误
TypeError:unhabable类型:“list”

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

第一种解决方案似乎是转换字符串表示形式中的整数对:

mydict=dict()
mydict[ str(1)+" "+str(2) ] = 'xxx'
第二种解决方案涉及元组:

mydict=dict()
mydict[ tuple([1,2]) ] = 'xxx'
从一些实验中我发现元组解比字符串解慢。
有没有一种更有效、更快速的方法可以简单地使用两个整数作为键?

您可能应该使用一个元组,它可以散列:

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'
顺便提一下,关于元组键字典的阅读速度有一个问题:


对内联索引进行了一点评测,结果显示内联索引的可读性很差(提示:Read。这对提高代码的可读性有很大帮助。我认为您的计时很糟糕。我对它进行了计时,发现直接构造元组(
mydict[(x,y)]
)是最快的。如果您先构造一个列表,然后将其转换为元组(这是不必要的),它需要大约1.7倍的时间(
mydict[tuple([x,y])]
)。字符串方法是最慢的,慢了2.6倍。如果tuple已经存在,你可以使它更快,
mydict[some_tuple]
mydict[(x,y)]快0.7倍
@lazyr这是只用于插入还是也用于访问?@Hans只用于插入。我创建了一个预填充的列表,其中包含10万个随机整数的两个元组和一个空的
dict
,然后对这些元组上的for循环进行计时(
用于x,y in…
)使用variuos方法插入到dict中的。我使用
None
作为所有键的插入值。如果同时用于插入和访问会更好。@tim pietzcker:干杯,我对字典赋值一无所知。两个改进:(1)
mydict[1,2]
相当于
mydict[(1,2)]
而且看起来更好一点。(2)
index
函数调用可能比构造元组更昂贵,因此您可能希望内联该算法。@JamesHenstridge:1:有效点,尽管我正在尝试确定将其作为隐式元组是否比显式元组更具指导性-我怀疑显式元组更容易看出您可能有
tup=(1,2);mydict[tup]
,不过也许我应该指出这一点。2:如果要在当前范围外重用索引,以避免容易产生但令人沮丧的错误,我通常更喜欢显式定义索引函数。不过,这仍然是一个重要的问题,因此我将更新。没有关于函数更可靠和可调试的争论。但是如果您我们正在做这样的优化,如果优化速度更快的话会有所帮助:)@PhilH:不,我没有做所有的事情或类似的事情。我正在编写一个Graph类,其中edge具有属性,因此当我指定源节点和目标节点时,属性会放在字典中。g.addEdge(1,2,“this edge attribute”)实现为def addEdge(self,src,targ,attrib):edges[src,targ]=attrib我还必须从源节点和目标节点识别边属性,所以我想知道最快的方法是什么