Преобразовать текст во вложенный список - PullRequest
1 голос
/ 13 мая 2019

Я пытаюсь разбить текст на несколько списков.Я пробовал несколько способов, но безуспешно.

Вот пример:

text_1 = "A-0  100  20  10  A-1  100  12  6  A-2  100  10  5"

Результат, который я хотел бы получить, следующий:

[['A-0', '100', '20', '10'], ['A-1', '100', '12', '6'], ['A-2', '100', '10', '5']]

Я использовал регулярное выражение для определения A- в качестве разделителя для разделения.Тем не менее, я изо всех сил пытается разделить его.Может быть, есть лучший способ решить эту проблему?

Это всего лишь пример, поскольку решение, которое я использую для экстрактора данных PDF, мне удалось построить.

Ответы [ 5 ]

1 голос
/ 13 мая 2019

Если вы знаете, что у вас всегда будут группы 4, можете играть с zip и iter

x = iter(text_1.split())

Тогда

list(zip(*[x]*4)) # or list(zip(x,x,x,x))

Выход

[('A-0', '100', '20', '10'),
 ('A-1', '100', '12', '6'),
 ('A-2', '100', '10', '5')]
0 голосов
/ 14 мая 2019

Подход на основе регулярных выражений - поскольку вы уже используете регулярное выражение для своего решения:

Код

from re import split

def split_lst(regex, string):
  return filter(lambda x: x.strip(), split(regex, string))

text_1 = "A-0  100  20  10  A-1  100  12  6  A-2  100  10  5"

print(list(map(
  lambda x: list(split_lst(r"\s", x)), 
  split_lst(r"(A-\d+\s+\d+\s+\d+\s+\d+)", text_1)
)))

результат

[['A-0', '100', '20', '10'], ['A-1', '100', '12', '6'], ['A-2', '100', '10', '5']]

Repl.it ссылка

0 голосов
/ 14 мая 2019

Если вы хотите использовать регулярное выражение (регулярные выражения - это круто) и иметь динамическое количество элементов в каждом подсписке, попробуйте следующее:

import re
text_1 = "A-0  100  20  10  A-1  100  12  6  A-2  100  10  5"
my_list = re.findall(r'A-[^A]*', text_1)
for i in range(0, my_list.__len__()):
    my_list[i] = my_list[i].split()
print(my_list)
0 голосов
/ 14 мая 2019

это мое решение:

text_1 = "A-0  100  20  10  A-1  100  12  6  A-2  100  10  5"
# split text by space
text_array = text_1.split()
# result: ['A-0', '100', '20', '10', 'A-1', '100', '12', '6', 'A-2', '100', '10', '5']

# get array length
text_array_size = len(text_array)
# which is 12 in this case
formatted_text_array = []

# create a loop which runs 3 times and split youre array 4 by 4
for i in range(int(text_array_size/4)):
    formatted_text_array.append(text_array[i*4:i*4+4])

print(formatted_text_array)
# result: [['A-0', '100', '20', '10'], ['A-1', '100', '12', '6'], ['A-2', '100', '10', '5']]
0 голосов
/ 13 мая 2019

Я думаю, что это может быть немного проще сделать с помощью встроенного строкового метода .split.При этом вы можете сделать следующее:

# Add whitespace at the end of text_1 so that 
# the final split will be the same format as all other splits

text_1="A-0 100 20 10 A-1 100 12 6 A-2 100 10 5" + " "


step1 = text_1.split("A-")

# [1:] here because we want to ignore the first empty string from split
step2 = ["A-" + i for i in step1[1:]] 

# [:-1] here because we know the last element in the new split will always be empty 
# because of the whitespace before the next "A-"
final = [i.split(' ')[:-1] for i in step2]

Окончательный вариант будет:

[['A-0', '100', '20', '10'], 
['A-1', '100', '12', '6'], 
['A-2', '100', '10', '5']]

Это должно работать для списков произвольного размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...