1

我正在尝试创建一个字典字典,其键具有两部分 k1 和 k2。k1 是实际密钥,k2 是 dict[k1, k2] 的长度。在下面的示例中,k1 是“cat”,k2 是 10。k2 只是值列表的大小,对键的唯一性没有贡献。

dict = {
        cat, 10: [value1, value2, value3, ..., value10],
        dog, 15: [value1, value2, value3, ..., value15],
        zen, 15: [value1, value2, value3, ..., value15]
       }

我所做的是,在没有k2的情况下实现了dict,然后将k1和k2连接起来,这意味着key实际上是k1k2,导致了下面的实现。

if key not in dict:
  dict[key] = [value1]
else:
  if value_n not in dict[key]:
    dict[key].append(value_n)

for key in dict:
  key = key + str(len(dict[key]))

现在字典看起来像这样。

dict = {
        cat10: [value1, value2, value3, ..., value10],
        dog15: [value1, value2, value3, ..., value15],
        zen15: [value1, value2, value3, ..., value15]
       }

由于我不想将 k2 存储在单独的数据结构中,如何在字典中实现多部分键?

4

2 回答 2

3

不确定您的用例到底是什么。但在我看来,您可以选择几种选择之一。这取决于“长度”键 (k2) 是创建列表的原因,还是只是它的一个指标。


您可以使用嵌套字典:

dict = {
        'cat' : {10: [value1, value2, value3, ..., value10]},
        'dog' : {15: [value1, value2, value3, ..., value15]},
        'zen' : {15: [value1, value2, value3, ..., value15]}
       }

dict['cat'][10]因此,如果“长度”(k2)只是长度的一个指标,那么访问将是有效的。


您可以创建一个自定义类,它可以让您访问“键”并指定您想要的值的长度。类中的方法类似于

def method(self, key, length):
    return self.__dict__[key][:length]

您可以使用元组作为键:

dict = {
        ('cat', 10) : [value1, value2, value3, ..., value10],
        ('dog', 15) : [value1, value2, value3, ..., value15],
        ('zen', 15) : [value1, value2, value3, ..., value15]
       }
于 2013-05-02T09:10:40.957 回答
1

您可以创建一个类__eq____hash__实现。然后您可以将该类的实例用作字典键:

class MyKey(object):
    def __init__(self, animal, length):
        self.__animal = animal
        self.length = length

    @property
    def animal(self):
        return self.__animal

    def __hash__(self):
        return hash(self.__animal)

    def __eq__(self, other):
        return self.__animal == other.animal

    def __repr__(self):
        return "{0}({1}, {2})".format(
            self.__class__.__name__, self.animal, self.length)

我希望我已经正确理解了您,因为您只想将动物用作键,并且只需将长度与它捆绑在一起,而不会影响键的唯一性。

如您所见,我将动物设置为只读属性并对基础属性进行了名称修改,以防止您意外更改该属性。如果您对用作 dict 键的实例执行此操作,TM将会发生坏事。

请注意,由于 dict 看到MyKey("ox", 9)与 相同的键MyKey("ox", 3),因此据我所知,这样的代码的行为是未指定的:

d = {}
d[MyKey("ox", 9)] = "a"
d[MyKey("ox", 3)] = "b"
assert len(d) == 1
# will the key have value 9 or 3? I wouldn't depend on it always being the same.
print d.keys()

所以现在你可以有这样的代码:

key = MyKey(animal, 0)
if key not in mydict:
    mydict[key] = [value1]
else:
    if value_n not in mydict[key]:
        dict[key].append(value_n)

for key, value in mydict.items():
    key.length = len(value)

话虽如此,您最好以另一种方式解决此问题。为什么需要长度时不能len(value)直接调用?这是一个非常快的操作(实际上,它只是读取底层 python 对象的一个​​预先计算好的变量。)

于 2013-05-02T09:16:33.087 回答