小编Ale*_*x J的帖子

python的可逆字典

我想以类似的形式将一些数据存储在Python中:{1:'a', 2:'b'}.每个值都是唯一的,不仅仅是其他值,还包括键.

是否有一个简单的数据结构,我可以使用它来获取相应的对象,无论我是否要求使用'key'或'value'?例如:

>>> a = {1:'a', 2:'b'}
>>> a[1]
'a'
>>> a['b']
2
>>> a[3]
KeyError
Run Code Online (Sandbox Code Playgroud)

'keys'是标准的python int,值是短(<256char)字符串.

我目前的解决方案是创建一个反向字典并搜索它,如果我在原始字典中找不到结果:

pointsreversed = dict((v, k) for k, v in points.iteritems())
def lookup(key):
    return points.get(key) or pointsreversed.key()
Run Code Online (Sandbox Code Playgroud)

这使用了两倍的空间,这不是很好(我的词典可以达到几百兆),平均减慢50%.

编辑:正如在几个答案中提到的,两个dicts不会使内存使用量增加一倍,因为它只是字典,而不是内部的项目,即重复.

有没有改进的解决方案?

python dictionary hashtable

9
推荐指数
2
解决办法
6014
查看次数

Python中的标志

我正在使用一个大矩阵(250x250x30 = 1,875,000个单元格),我想要一种方法为这个矩阵中的每个单元设置任意数量的标志,这种方式易于使用且空间效率合理.

我最初的计划是一个250x250x30列表数组,其中每个元素都是这样的:["FLAG1","FLAG8","FLAG12"].然后我将其改为仅存储整数:[1,8,12].这些整数由getter/setter函数在内部映射到原始标志字符串.这仅使用250mb,每点8个标志,这在内存方面很好.

我的问题是:我是否错过了构建此类数据的另一种明显方法?

谢谢大家的建议.我最后将一些建议合而为一,遗憾的是,我只能选择一个答案而不得不与其他人一起生活:

编辑:我在这里使用的初始代码(使用集合作为3d numpy数组的基本元素)使用了大量内存.这个新版本在填充时使用大约500mb randint(0,2**1000).

import numpy

FLAG1=2**0
FLAG2=2**1
FLAG3=2**2
FLAG4=2**3

(x,y,z) = (250,250,30)

array = numpy.zeros((x,y,z), dtype=object)


def setFlag(location,flag):
    array[location] |= flag
def unsetFlag(location,flag):
    array[location] &= ~flag
Run Code Online (Sandbox Code Playgroud)

python flags numpy matrix

4
推荐指数
3
解决办法
6698
查看次数

标签 统计

python ×2

dictionary ×1

flags ×1

hashtable ×1

matrix ×1

numpy ×1