向默认字典值列表添加值

3

Python问题:

我有一个默认字典/字典,比如a [1] = (1,2,3),这样a [1] [0] = 1等等。 现在我想在同一个键上添加值的列表。请注意,我不想追加,而是在同一个列表中添加更多的值。例如,我想在键a[1]中添加5,但仅在单个列表中:

a[1][1].append("5") = (1, [2,5], 3) 

有什么可以帮助我完成这个任务的吗?

不知道你实际想做什么,很难给你建议。两个通用的提示:从你想要引用这个结构的代码开始,向后构建数据结构,并尝试不要在单个层次结构中混合列表和标量 - 考虑一个元素的列表。 - Russell Borogove
我有一个字典,想要在同一个键下添加更多的值。这种操作是否可行? - Scooby
你想通过这样做实现什么目标?看起来你已经选择了错误的解决方案来解决其他问题,现在正在询问如何使该解决方案工作。如果你告诉我们你真正想要做什么,我们可能能够提供更好的答案。 - user2357112
3个回答

4
你的问题是:
我有一个字典,想在同一个键中添加更多的值。这是否有可能?
不直接。字典始终仅有一个键对应一个值。使用defaultdict也无法改变这一点。
但通常模拟一个具有多个值的字典(一些语言称之为“multidict”)的方法是将多个值的列表作为单个值。例如:
>>> d = {'a': [0, 1, 2], 'b': [1, 2, 3]}
>>> d['a'].append(3)
>>> d['a']
>>> [0, 1, 2, 3]

您似乎在使用元组而不是列表。虽然您可以这样做,但是由于元组是不可变的,因此无法在它们上调用append方法;您必须用新的更大的元组替换它们。就像这样:

>>> d = {'a': (0, 1, 2), 'b': (1, 2, 3)}
>>> d['a'] = d['a'] + (3,)
>>> d['a']
>>> (0, 1, 2, 3)

那会使代码比使用列表更加复杂,但它能运行。
同时,在这里使用defaultdict是完全无关紧要的。defaultdict所做的只是自动处理键不存在的情况。例如:
>>> d = {'b': (1, 2, 3)}
>>> d['a'] = d['a'] + (3,)
KeyError: 'a'
>>> d = defaultdict(tuple, {'b': (1, 2, 3)})
>>> d['a'] = d['a'] + (3,)
>>> d
{'b': (1, 2, 3), 'a': (3,)}

同时,看起来你正在尝试使用一种通常为每个键存储单个值的结构,但在第一次需要扩展它时可以神奇地转换为多个值。在一般情况下,这是有歧义的-无法区分单个值是否恰好是元组或列表与多个值。您可以在特定情况下执行此操作,其中您知道您的值永远不会是集合(但请记住,字符串是字符串的集合;这将在某些时候困扰您…)或可能是集合,但永远不会是您正在使用的特定类型的集合。但因为这通常不是一个好主意,Python并没有使其易于实现。因此,您必须执行类似于以下内容的操作:

def add_to_multidict(multidict, key, value):
    if key in multidict:
        if isinstance(multidict[key], tuple):
            multidict[key] = multidict[key] + (value,)
        else:
            multidict[key] = (multidict[key], value)
    else:
        multidict[key] = value

如果你想将此作为字典的方法调用,你需要子类化dict并编写相应的方法。如果你想将其作为值的方法调用,则还需要子类化tuple,并使字典子类使用元组子类。
最后,看起来你不仅想在多维字典本身上这样做,而且还想在多维字典存储的单个值上这样做——换句话说,你想让每个键映射到一个对象元组,这些对象本身可以是单个对象或对象元组。你需要编写代码将该逻辑进一步推向下一级;这并不难。
如果你想将其无限次地推向下一级,以便可以执行 d['a'][1][2][1].append(3),那么你需要进行递归:元组子类只需在扩展值时创建自身的实例,而不是创建元组。

3
在Python中,元组是不可变的,所以你试图做的事情是行不通的。

0
a[1] = [[1], [2], [3]]

a[1][1].append(5)     # -> [[1], [2, 5], [3]]

目前不清楚您想要实际做什么;可能有更好的方法来完成它。


他在代码示例中使用元组。元组不可变。 - rdodev
忘掉元组,有没有办法在字典/默认字典的值列表中添加内容? - Scooby
最好使用列表而不是元组。 - dstromberg
那么我确实需要将它们映射到键,所以我会在字典中使用列表,并对它们使用append?这是你的意思吗? - Scooby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接