Преобразование длинной строки, подобной списку, в новый список - PullRequest
0 голосов
/ 17 января 2019

У меня есть вопрос, связанный с (предварительной) обработкой текстовой информации. Моя структура данных в каждой строке CSV выглядит следующим образом:

row = "['Adventure' 'African elephant' 'Animal' 'Ball game' 'Bay' 'Body of water' 'Communication Device' 'Electronic device']"

Желаемый результат после трансформации:

[adventure, african_elephant, animal, ball_game, bay, body_of_water, communication_device, electronic_device]

Вопрос: Как решить эту проблему наиболее эффективно и эффективно (100 000 документов)? Приветствуются решения RegEx и не-RegEx в Python.

Решения:

%%time
import ast
row = "['Adventure' 'African elephant' 'Animal' 'Ball game' 'Bay' 'Body of water' 'Communication Device' 'Electronic device']"
row = ast.literal_eval(','.join(['_'.join(i.lower().split()) for i in row.split("' '")]))[0].split(',')
row

CPU times: user 43 µs, sys: 1 µs, total: 44 µs
Wall time: 48.2 µs

%%time
row = "['Adventure' 'African elephant' 'Animal' 'Ball game' 'Bay' 'Body of water' 'Communication Device' 'Electronic device']"
row = [w.lower().replace(' ', '_') for w in re.findall(r"'([^']*)'", row)]
row

CPU times: user 25 µs, sys: 1e+03 ns, total: 26 µs
Wall time: 29.1 µs

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Это должно работать

import re
document = "['Adventure' 'African elephant' 'Animal' 'Ball game' 'Bay' 'Body of water' 'Communication Device' 'Electronic device']"
list = re.findall("'([^']*)'", document)
0 голосов
/ 17 января 2019

Вы можете использовать этот код:

>>> row = "['Adventure' 'African elephant' 'Animal' 'Ball game' 'Bay' 'Body of water' 'Communication Device' 'Electronic device']"
>>> [w.replace(' ', '_') for w in re.findall(r"'([^']*)'", row.lower())]
['adventure', 'african_elephant', 'animal', 'ball_game', 'bay', 'body_of_water', 'communication_device', 'electronic_device']

Детали:

  • row.lower(): преобразует входную строку в нижний регистр
  • re.findall преобразует строчную входную строку в список, находя подстроку, заключенную в одинарные кавычки
  • w.replace заменяет пробел _ в каждом элементе списка
0 голосов
/ 17 января 2019

Простое понимание списка

import ast
document = "['Adventure' 'African elephant' 'Animal' 'Ball game' 'Bay' 'Body of water' 'Communication Device' 'Electronic device']"
ast.literal_eval(','.join(['_'.join(i.lower().split()) for i in document.split("' '")]))

Вывод (в виде списка, содержащего одну строку)

['adventure,african_elephant,animal,ball_game,bay,body_of_water,communication_device,electronic_device']

Теперь, если вам нужен список строк

ast.literal_eval(','.join(['_'.join(i.lower().split()) for i in document.split("' '")]))[0].split(',')

выход

['adventure',
 'african_elephant',
 'animal',
 'ball_game',
 'bay',
 'body_of_water',
 'communication_device',
 'electronic_device']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...