的Python问题的字典清单:将值设置为默认值
我有一个默认的字典/快译通,说a[1] = (1,2,3)
这样a[1][0] = 1
等。 现在我想添加到同一个键值的列表。请理解,我不想追加,但在同一个列表中添加更多值。例如,我想5添加到该键的[1],但只能在单一的名单,因此:
a[1][1].append("5") = (1, [2,5], 3)
有什么可以帮助我做到这一点?
的Python问题的字典清单:将值设置为默认值
我有一个默认的字典/快译通,说a[1] = (1,2,3)
这样a[1][0] = 1
等。 现在我想添加到同一个键值的列表。请理解,我不想追加,但在同一个列表中添加更多值。例如,我想5添加到该键的[1],但只能在单一的名单,因此:
a[1][1].append("5") = (1, [2,5], 3)
有什么可以帮助我做到这一点?
你问:
嗯,我有一个字典,我想更多的值添加到相同的密钥。这是可能的吗?
不直接。一个字典每个键总是只有一个值。使用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
的子类,并使您的dict子类使用元组子类。
最后,它看起来像你想这样做不仅与multidict本身,还与该multidict店 - 换句话说,你希望每个键映射到一组对象的单个值它们本身是单个对象或对象的元组。您需要编写代码以将该逻辑向下推进一步;这并不难。
如果你想推下来的步骤的无限数,所以你可以做d['a'][1][2][1].append(3)
,那么你会想这样做递归:元组的子类只具有扩大的值时,创建自己的实例,而不是创建一个元组。
a[1] = [[1], [2], [3]]
a[1][1].append(5) # -> [[1], [2, 5], [3]]
目前还不清楚你实际上试图用这种方法实际做什么;可能有更好的方法来实现它。
在Python中,元组是不可变的,所以你试图做的事情是行不通的。
不知道你实际想要做什么,很难告诉你。两个一般的技巧:从你想要的引用*这个结构的代码开始,看看是什么样的,并且向后工作来构建数据结构,并且尽量不要在单个层次上混合列表和标量 - 考虑一个元素的列表代替。 –
那么,我有一个字典,我试图给同一个键添加更多的值。这是可能的吗? – Scooby
你想通过这样做来达到什么目的?看起来您已经决定解决其他问题的错误方法,现在正在询问如何使该解决方案有效。如果您告诉我们您真的想要做什么,我们可能会提供更好的答案。 – user2357112