我在下面有一本字典
data = {'missing_entities': [], 'score': 0.946, 'entities_found': [('location', 'blr'), ('relative_time', 'last 10 hours')]}
我想用location
替换键entities_found
的值loc
和
值relative_time
和period
。但是我无法做到这一点。这是我在下面所做的
list(data['entities_found'][0])[0] = 'loc'
list(data['entities_found'][1])[0] = 'period'
我仍然得到原始的字典值。我在做什么错了?
答案 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