我有一种情况需要创建一个字典来跟踪值的全局顺序。我还没有找到一个很好的方法让班级本身有一个递增的计数器,也可以跟踪价值。
这是我在此期间所写的内容,以解决这个问题:
from collections import defaultdict
class NotMyDict(object):
""" defaultdict(list) that tracks order globally across the dict.
Will function as a normal defaultdict(list) unless you modify the
'ordered' attribute and set it to a non-false evaluating value. This
"""
ordered = False
_data = defaultdict(NotMyDictList)
_next_index = 0
class NotMyDictList(list):
def append(self, value):
def __repr__(self):
if self.ordered:
return repr(self._data)
else:
temp = defaultdict(list)
for key in self._data:
for value in self._data[key]:
temp[key].append(value[0])
return repr(temp)
def __getitem__(self, key):
if self.ordered:
return self._data[key]
else:
return [val[0] for val in self._data[key]]
def add_value_to_key(self, key, value):
self._data[key].append((value, self._next_index))
self._next_index += 1
所以我可以像普通字典一样使用它来提取值。如果密钥不存在,我可以实例化一个列表,但defaultdict简单易行。
以下是使用示例:
test = NotMyDict()
test.add_value_to_key('test', 'hi')
test.add_value_to_key('test', 'there')
test.add_value_to_key('test', 'buddy')
test['test']
Result:
['hi', 'there', 'buddy']
test.ordered = True
test['test']
Result:
[('hi', 0), ('there', 1), ('buddy', 2)]
现在 - 使用的例子并不是非常重要,但我似乎无法弄清楚的功能,而不是使用.add_value_to_key(),我希望能够使用普通的defaultdict(list)约定:
dict[key].append()
并且仍然跟踪索引。我是否需要传递带有id()的全局对象位置并在内存级别引用这些对象,或者我是否有一种方法可以让我不了解全局"类全局"它的成员可以访问它吗?
我也曾尝试使用嵌套类,但嵌套类无法访问父类的全局变量,所以我必须:
我真的无法理解如何以一种让我使用defaultdict(list)的相同功能来创建这个对象/类的方式,我可以在其中索引/追加直接并让它跟踪该新值的全局索引顺序。
dict[key].append(value)
帮助将不胜感激 - 我在尝试使用不同的解决方案三个小时后才取消它并使用"只需使用此方法追加"现在。