python-使用哪种数据结构作为DICT数组?
我需要构建这样的数据结构:python-使用哪种数据结构作为DICT数组?,python,arrays,list,namedtuple,Python,Arrays,List,Namedtuple,我需要构建这样的数据结构: { key: {k: v for k in range(fixed_small_number)} for key in range(fixed_large_number) } 问题是,我正在以一种“折衷”的方式构建它,在这种方式下,每次都会有一个项目放入一个随机k作为一个随机键,也就是说,我需要随机访问,我需要内部dict是可变的 因此,我的问题分为两部分: 外部目录的建议类型 内部目录的建议类型 对我来说,“最好”的解决方案是一个可变名称的数组,只
{
key: {k: v for k in range(fixed_small_number)}
for key in range(fixed_large_number)
}
问题是,我正在以一种“折衷”的方式构建它,在这种方式下,每次都会有一个项目放入一个随机k作为一个随机键,也就是说,我需要随机访问,我需要内部dict是可变的
因此,我的问题分为两部分:
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
编辑2:
事实证明,列表确实可以您可以构建一个自定义类,使用
\uuuuuu插槽\uuuuuuu
来限制使用的内存量:
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__))
然后在你的结构中使用这些。它们可以像命名元组一样使用(允许通过索引和名称进行访问),但它们允许变异。通过使用\uuuuu插槽
每个实例的内存占用率保持较低:
>>> 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'
当然,您会给插槽起一个有意义的名称,请为您的类选择一个比我在示例中使用的名称更好的名称。:-)
要扩展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
def method(iter_of_3_item_iters):
d = defaultdict(dict)
for (a, b, c) in iter_of_3_item_iters:
d[a][b] = c
return d
defaultdict
感觉就在这里:
from collections import defaultdict
d = defaultdict(lambda: defaultdict(int))
d[3][4] = 10
如果您想要固定大小的列表,defaultdict
是否涵盖:
d = defaultdict(lambda: [None]*fixed_small_number)
d[3][4] = 10
# d[3] is now [None, None, None, None, 10, None, None, ...]
举个例子:
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
解决办法确实是使用
答复:
{'a': {1: 2, 2: 1, 3: 1}, 'b': {1: 3, 3: 1}}
作为一项功能:
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
def method(iter_of_3_item_iters):
d = defaultdict(dict)
for (a, b, c) in iter_of_3_item_iters:
d[a][b] = c
return d
如果我正确理解这个问题,我不确定这是否可行。诸如
dict
s之类的可变对象不能是字典键。无论如何,不清楚您要实现什么。您能否举例说明如何“折衷地”构建此数据结构?例如,给定单个更新的前后状态?我不确定我是否理解。。我建议dict作为键的作用在哪里?嵌套dict是从哪里来的?TBH一开始看起来不像是有效的Python,您应该真正扩展您的代码示例以显示您正在尝试做什么。写出实际的虚拟数据?或者\uuu slots\uuu=['field{}'。在xrange(3)]中为i设置格式(i+1)
(当有更多字段时很有用)@nneonno:我应该使用foo
、bar
和baz
作为字段名;它们是说明性的。