Python 构造具有多部分键的词典

Python 构造具有多部分键的词典,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我正在尝试创建一个字典dict,其键有两个部分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, valu

我正在尝试创建一个字典dict,其键有两个部分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,这意味着密钥实际上是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存储在单独的数据结构中,如何在字典中实现多部分键?

不确定这里的用例是什么。但在我看来,你可以做几个选择中的一个。这取决于“长度”键(k2)是创建列表的原因,还是仅仅是列表的一个指示器


您可以使用嵌套字典:

dict = {
        'cat' : {10: [value1, value2, value3, ..., value10]},
        'dog' : {15: [value1, value2, value3, ..., value15]},
        'zen' : {15: [value1, value2, value3, ..., value15]}
       }
因此,访问将是
dict['cat'][10]
,如果“长度”(k2)只是长度的一个指示符,那么这将起作用


您可以创建一个自定义类,该类允许您访问“键”,并指定希望值的长度。类中的方法类似于:


可以使用元组作为键:

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

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


您可以使用嵌套字典:

dict = {
        'cat' : {10: [value1, value2, value3, ..., value10]},
        'dog' : {15: [value1, value2, value3, ..., value15]},
        'zen' : {15: [value1, value2, value3, ..., value15]}
       }
因此,访问将是
dict['cat'][10]
,如果“长度”(k2)只是长度的一个指示符,那么这将起作用


您可以创建一个自定义类,该类允许您访问“键”,并指定希望值的长度。类中的方法类似于:


可以使用元组作为键:

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

您可以创建一个实现了
\uuuuu eq\uuuu
\uuuuu hash\uuuu
的类。然后可以将该类的实例用作字典键:

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键的实例执行此操作,则会发生不好的事情stm

请注意,由于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对象的一个预先计算的变量)。

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

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键的实例执行此操作,则会发生不好的事情stm

请注意,由于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对象的一个预先计算的变量)。

您尝试过使用元组吗?例如:
('cat',10):[value1…,value15]
?当您可以只使用将返回的len(dict[cat])时,为什么要在给定的时间存储len10@Jon:我不知道有一个元组。谢谢你的评论。让我来研究一下。@Rohit:k2实际上是一个在填充值列表时交互派生的值。我在这里把k2作为一个长度来保持问题的简单性。你试过使用元组吗?例如:
('cat',10):[value1…,value15]
?当您可以只使用将返回的len(dict[cat])时,为什么要在给定的时间存储len10@Jon:我不知道有一个元组。谢谢你的评论。让我来研究一下。@Rohit:k2实际上是一个在填充值列表时交互派生的值。我在这里把k2作为一个长度来保持问题的简单性。谢谢你的详细回答。对于您最后的问题,k2实际上是一个值,它是在值列表填充时相互派生的值。我在这里把k2作为一个长度来保持问题的简单性。谢谢你的详细回答。对于您最后的问题,k2实际上是一个值,它是在值列表填充时相互派生的值。我在这里把k2作为一个长度来保持问题的简单性。我可以在嵌套的dict中看到一件事。稍后在程序中,如果用户想要添加或删除某些内容(例如在cat值11中),那么dict将在cat中同时包含10和11dict@RohitSrivastava对不起,你的评论对我来说毫无意义。你能再试一次吗?或者,您可以用代码来说明您的示例,并将一个链接到它?OP的目的是增加它的长度。假设我想在cat中添加一个值11:{10:[value1,…,value 10]}。如果我添加它并使用相同的命令,那么它可能会变成cat:{10:[value1,…,value10],11:[value1,…,value11]或其他任何东西,根据实现的不同,可能还有其他一些情况。OP需要处理这些事情。我可以在嵌套的dict中看到一件事情。稍后在程序中,如果