用列表的其他项替换包含列表的字典的值

时间:2018-07-04 07:12:43

标签: python python-3.x dictionary

我在下面有一本字典

data = {'missing_entities': [], 'score': 0.946, 'entities_found': [('location', 'blr'), ('relative_time', 'last 10 hours')]}

我想用location替换键entities_found的值loc和 值relative_timeperiod。但是我无法做到这一点。这是我在下面所做的

list(data['entities_found'][0])[0] = 'loc'
list(data['entities_found'][1])[0] = 'period'

我仍然得到原始的字典值。我在做什么错了?

6 个答案:

答案 0 :(得分:1)

不确定为什么要这样做,元组是不可变的,但是您可以覆盖列表内容

data['entities_found'][0]=('loc',data['entities_found'][0][1])

答案 1 :(得分:1)

您的entities_found是一个元组列表。元组本质上是不可变的。像这样替换整个元组:

data['entities_found'][0] = ('location', 'new_loc')

答案 2 :(得分:1)

因为

list(data['entities_found'][0])

创建一个新列表,然后将其用于基于索引的赋值,但永远不要保留对新列表的引用,因此将立即对其进行回收。永远不会触摸原始对象。

即使元组是可变的,如列表,这也不起作用。观察:

>>> x = [1, 2, 3]
>>> list(x)[0] = 99
>>> x
[1, 2, 3]

或更清晰地说:

>>> ts = [('a','b'), ('c','d')]
>>> list(ts[0]) # convert object at index 0 to list
['a', 'b']
>>> ts
[('a', 'b'), ('c', 'd')] # original object hasn't changed

您将不得不执行以下操作:

>>> ts = [('a','b'), ('c','d')]
>>> first, second = ts
>>> ts[0] = 'foo', first[1]
>>> ts[1] = 'bar', second[1]
>>> ts
[('foo', 'b'), ('bar', 'd')]

答案 3 :(得分:1)

我认为找到键的实体的值是元组,因此您不能更新元组的单个值。您必须将元组更改为列表,或者用另一个元组更新元组。

data['entities_found'][0] = ('loc', data['entities_found'][0][1])
data['entities_found'][1] = ('period', data['entities_found'][1][1])

^这是上述第二种方式。

答案 4 :(得分:0)

在Python中,字符串是不可变的。因此,如果您发现自己必须在元组中编辑值,那么列表可能会更好地满足您的目的。

如果您真的坚持要这样做,则需要将元组转换为列表,在此列表中进行字符串更改,将列表转换回元组,然后将其重新插入字典中。

这是一种方法:

a = list(data['entities_found'][0])
a[0] = 'loc'

b = list(data['entities_found'][1])
b[0] = 'period'

data['entities_found'][0] = tuple(a)
data['entities_found'][1] = tuple(b)

输出:

{'entities_found': [('loc', 'blr'), ('period', 'last 10 hours')],
 'missing_entities': [],
 'score': 0.946}

答案 5 :(得分:0)

python中的元组是不可变的。所以不能真正赋值。 在此处了解有关此内容的更多信息:http://radar.oreilly.com/2014/10/python-tuples-immutable-but-potentially-changing.html