Как разделить строковое значение словаря в списке словарей, чтобы добавить новый элемент словаря? - PullRequest
0 голосов
/ 05 апреля 2019

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

Например, если у меня есть:

alist =[{'id':1, 'text':'Dogs are great'},

{'id':2, 'text':'Cats are great'},

'id':3, 'text':'Fish are smelly'}]

Я бы хотел добавить новое поле с именем first_word:

alist =[{'id':1, 'text':'Dogs are great', 'first_word':'Dogs'},

{'id':2, 'text':'Cats are great', 'first_word':'Cats'},

'id':3, 'text':'Fish are smelly', 'first_word':'Fish'}]

Код, который я использовал, чтобы попытаться это сделать, приведен ниже:

for ditem in alist:
    ditem['first_word'] = ditem['text'].split()[0]

однако я получаю сообщение об ошибке:

IndexError: список индексов вне диапазона

Как я могу это сделать?

Ответы [ 7 ]

1 голос
/ 05 апреля 2019

Передайте символ пробела в метод split, например:

for ditem in alist:
    ditem['first_word'] = ditem['text'].split(' ', 1)[0]

Используйте второй аргумент для .split(), чтобы разрешить преждевременное расщепление в случае больших строк.

0 голосов
/ 05 апреля 2019

Отложив пропущенную фигурную скобку, ваш код работает на вводимом вами показе.

Единственное обстоятельство, при котором вы получите исключение list index out of range, это если text пусто:

In [11]: for ditem in alist:
    ...:     ditem['first_word'] = ditem['text'].split()[0]
    ...:
IndexError: list index out of range

Одним из способов решения этой проблемы является явная обработка пустого текста:

In [12]: for ditem in alist:
    ...:     ditem['first_word'] = ditem['text'].split()[0] if ditem['text'] else ''
    ...:
    ...:
0 голосов
/ 05 апреля 2019

Указанный вами IndexError должен произойти, только когда вы пытаетесь получить доступ к элементу списка, который не существует.У вас есть только один доступ к списку (вывод списка из ditem['text'].split(), и вы пытаетесь получить доступ к его первому элементу, поэтому список должен быть пустым. Это происходит именно тогда, когда ditem['text'] пусто, что дает нам быстрое исправление:проверьте, пусто ли оно.

for ditem in alist:
    t = ditem['text']
    ditem['first_word'] = t.split()[0] if t else None
0 голосов
/ 05 апреля 2019

В вашем списке, вероятно, есть указания, текст которых пуст.

Вы можете либо санировать свои данные, либо, если вы хотите игнорировать пустые тексты, и добавить пустое 'first_word' в этом случае,Вы могли бы сделать:

for ditem in alist:
    ditem['first_word'] = ditem['text'].split()[0] if ditem['text'] else ''
0 голосов
/ 05 апреля 2019
alist =[{'id':1, 'text':'Dogs are great'}, {'id':2, 'text':'Cats are great'}, {'id':3, 'text':'Fish are smelly'}]

def append_kv(dd):
    dd['first_word '] = ''
    return dd

alist = [append_kv(dd) for dd in alist]
0 голосов
/ 05 апреля 2019

У вас есть ошибка в вашем словаре. Посмотрите на строку 3, если в списке отсутствует пропущенная фигурная скобка.

0 голосов
/ 05 апреля 2019

Ваш код работает хорошо, кроме опечатки. Вы пропустили { перед третьим пунктом.

Юпитер бросает это

  File "<ipython-input-17-6aeaa3a052d5>", line 5
    'id':3, 'text':'Fish are smelly'}]
        ^
SyntaxError: invalid syntax

Просто исправьте это

alist =[{'id':1, 'text':'Dogs are great'},
{'id':2, 'text':'Cats are great'},
{'id':3, 'text':'Fish are smelly'}]

for ditem in alist:
    ditem['firstword']=ditem['text'].split()[0]

alist

Выход:

[{'id': 1, 'text': 'Dogs are great', 'firstword': 'Dogs'},
 {'id': 2, 'text': 'Cats are great', 'firstword': 'Cats'},
 {'id': 3, 'text': 'Fish are smelly', 'firstword': 'Fish'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...