Заменить значения словаря, содержащего список, другими элементами для списка - PullRequest
0 голосов
/ 04 июля 2018

у меня словарь ниже

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'

Я все еще получаю исходные значения словаря. Что я делаю не так?

Ответы [ 6 ]

0 голосов
/ 04 июля 2018

Кортеж в Python является неизменным. Так что не могу присвоить значение. Узнайте больше об этом здесь: http://radar.oreilly.com/2014/10/python-tuples-immutable-but-potentially-changing.html

0 голосов
/ 04 июля 2018

Кортежи неизменны в 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}
0 голосов
/ 04 июля 2018

Я думаю, что значения найденных ключей сущностей являются кортежами, поэтому вы не можете обновить одно значение кортежа. Вы должны либо изменить кортеж в списке, либо обновить кортеж другим кортежем.

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

^ Это второй способ, описанный выше.

0 голосов
/ 04 июля 2018

Потому что

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')]
0 голосов
/ 04 июля 2018

Ваш entities_found - это список кортежей. Кортежи неизменны по своей природе. Замените весь кортеж так:

data['entities_found'][0] = ('location', 'new_loc')
0 голосов
/ 04 июля 2018

не знаю, зачем вы это делаете, кортежи неизменны, но вы можете переопределить содержимое списка

data['entities_found'][0]=('loc',data['entities_found'][0][1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...