首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字典是字典Python中的关键字

字典是字典Python中的关键字
EN

Stack Overflow用户
提问于 2012-11-06 10:42:52
回答 2查看 126关注 0票数 0

我想要一个O(1)方法来检查我是否处于一种状态。问题是,一个状态是由地图上几个缩放比的位置定义的。Zoombini = {(1,1):0,(2,2):1,(3,3):3} {Position: Zoombini ID}我正在使用广度优先搜索,并将这个位置字典推送到我的队列中。

代码语言:javascript
复制
dirs = [goNorth, goSouth, goWest, goEast] ## List of functions
zoom = {}
boulders = {}
visited = {} ## {(zoom{}): [{0,1,2},{int}]}
             ## {Map: [color, distance] 0 = white, 1 = gray, 2 = black
n = len(abyss)
for i in xrange(n):
    for j in xrange(n):
        if (abyss[i][j] == 'X'):
            boulders[(i,j)] = True
        elif (isInt(abyss[i][j])):
            zoom[(i,j)] = int(abyss[i][j])      ## invariant only 1 zomb can have this position
        elif (abyss[i][j] == '*'):
              exit = (i, j)
sQueue = Queue.Queue()
zombnum = 0
done = False
distance = 0
sQueue.put(zoom)
while not(sQueue.empty()):
    currZomMap = sQueue.get()
    for zom in currZomMap.iterkeys(): ## zoom {(i,j): 0}
        if not(zom == exit):
            z = currZomMap[zom]
            for fx in dirs: ## list of functions that returns resulting coordinate of going in some direction
                newPos = fx(zom)
                newZomMap = currZomMap.copy()
                del(newZomMap[zom]) ## Delete the old position
                newZomMap[newPos] = z ## Insert new Position
                if not(visited.has_key(newZomMap)):
                    sQueue.put(newZomMap)

我的实现还没有完成,但我需要一个更好的方法来检查我是否已经访问了一个状态。我可以编写一个函数,从字典中创建一个整数哈希,但我认为这样做效率不高。时间也是一个问题。我怎样才能以最佳的方式来做这件事呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-06 12:16:58

我可能只会使用frozenset,而不是构造一些脆弱的自定义散列函数

代码语言:javascript
复制
>>> Z = {(1,1): 0, (2,2):1, (3,3):3}
>>> hash(Z)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> frozenset(Z.items())
frozenset([((2, 2), 1), ((1, 1), 0), ((3, 3), 3)])
>>> hash(frozenset(Z.items()))
-4860320417062922210

冻结集可以存储在集合和字典中,没有任何问题。您也可以使用从Z.items()构建的元组,但您必须确保它始终以规范的格式存储(例如,首先对其进行排序)。

票数 1
EN

Stack Overflow用户

发布于 2012-11-06 10:59:16

Python不允许可变的键,所以我最终创建了一个函数来散列我的字典。

编辑--

代码语言:javascript
复制
def hashthatshit(dictionary):
result = 0
i =0
for key in dictionary.iterkeys():
    x = key[0]
    y = key[1]
    result+=x*10**i+y*10**(i+1)+\
             10**(i+2)*dictionary[key]
    i+=3
return result

我使用了它,它特定于我的实现,这就是我最初没有包含它的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13243577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档