phi*_*kis 0 python arrays list namedtuple
我需要构建一个像这样的数据结构:
{
key: {k: v for k in range(fixed_small_number)}
for key in range(fixed_large_number)
}
Run Code Online (Sandbox Code Playgroud)
问题是我正在以"不拘一格"的方式构建它,每次获得一个项目随机k放入一个随机密钥,即我需要随机访问,我需要内部字典是可变的.
所以我的问题分为两个:
外部字典的推荐类型.
内部字典的推荐类型.
对我来说,"最好的"解决方案是一系列可变的命名元组,只有这个不存在.
我可以使用一个namedtuples列表,然后使用新数据重新创建每个,但这听起来非常浪费,列表不是随机访问高效的,并且所有重写都是相同的数据.
我不知道有一些神奇的新结构吗?
编辑:用法示例:
for key, k, v in [('a', 1, 2), ('b', 1, 3), ('a', 2, 1), ('a', 3, 1), ('b', 3, 1) ...]:
my_structre[key][k] = v
Run Code Online (Sandbox Code Playgroud)
EDIT2:
事实证明,列表实际上支持随机访问
你可以构建一个自定义类,__slots__用来限制使用的内存量:
class MutableEfficientNamedList(object):
__slots__ = ('field1', 'field2', 'field3')
def __init__(self, *values):
for k, v in zip(self.__slots__, values):
setattr(self, k, v)
def __getitem__(self, i):
return getattr(self, self.__slots__[i])
def __setitem__(self, i, v):
return setattr(self, self.__slots__[i], v)
def __repr__(self):
return '{}({})'.format(type(self).__name__,
', '.join(repr(getattr(self, s)) for s in self.__slots__))
Run Code Online (Sandbox Code Playgroud)
然后在你的结构中使用它们.它们可以像命名元组一样使用(允许通过索引和名称访问)但它们允许变异.通过使用__slots__每个实例的内存占用率仍然很低:
>>> menl = MutableEfficientNamedList('foo', 'bar', 'baz')
>>> menl
MutableEfficientNamedList('foo', 'bar', 'baz')
>>> menl.field1
'foo'
>>> menl[0]
'foo'
>>> menl[1]
'bar'
>>> menl[1] = 'spam'
>>> menl.field2
'spam'
Run Code Online (Sandbox Code Playgroud)
你当然给插槽提供了有意义的名字,请为你的班级选择一个比我在我的例子中使用的更好的名字.:-)
要扩展namedtuple()模式,这里是一个通用工厂函数:
def namedlist(name, *attrs):
"""Create a named list class named `name` with attributes `attrs`.
`attrs` must be strings representing valid Python identifiers.
"""
class MutableEfficientNamedList(object):
__slots__ = attrs
def __init__(self, *values):
for k, v in zip(self.__slots__, values):
setattr(self, k, v)
def __getitem__(self, i):
return getattr(self, self.__slots__[i])
def __setitem__(self, i, v):
return setattr(self, self.__slots__[i], v)
def __repr__(self):
return '{}({})'.format(type(self).__name__,
', '.join(repr(getattr(self, s)) for s in self.__slots__))
MutableEfficientNamedList.__name__ = name
return MutableEfficientNamedList
MyList = namedlist('MyList', 'foo', 'bar', 'baz')
nl = MyList(1, 2, 3)
print nl # MyList(1, 2, 3)
print nl.bar # 2
print nl[1] # 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
295 次 |
| 最近记录: |