将值添加到默认dict值列表中

时间:2013-11-22 19:22:51

标签: python python-2.7 python-3.x

Python问题:

我有一个默认的dict / dict,比如说a[1] = (1,2,3)a[1][0] = 1等等。 现在我想添加到同一个键的值列表中。请理解,我不想附加,但在同一列表中添加更多值。例如,我想在密钥a [1]中添加5,但仅在单个列表中添加:

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

有什么东西能帮助我做到这一点吗?

3 个答案:

答案 0 :(得分:3)

你问:

  

好吧,我有一个字典,我正在尝试为同一个键添加更多值。这有可能吗?

不直接。 dict总是每个键只有一个值。使用defaultdict不会改变它。

模拟每个键的多个值(某些语言称为“multidict”)的dict的常用方法是使用这些多个值的列表作为单个值。例如:

>>> 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上的方法调用,则需要子类dict并编写方法来执行此操作。如果您希望能够将其作为值的方法调用,则还需要子类tuple,并使您的dict子类使用元组子类。


最后,看起来您不仅要使用multidict本身,还要使用multidict存储的各个值 - 换句话说,您希望每个键映射到一个对象元组,而这些对象本身也是单个对象或对象元组。您需要编写代码以将该逻辑向下推进一步;这并不难。

如果你想按下无限步数,那么你可以做d['a'][1][2][1].append(3),那么你将需要递归地执行此操作:元组子类只需要创建一个扩展值时的实例,而不是创建元组。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

目前尚不清楚你实际上是在尝试用它做什么;可能有更好的方法来实现它。