将文本转换为嵌套列表

时间:2019-05-13 20:04:24

标签: python loops text nested-lists

我正在尝试将文本分成几个列表。我尝试了几种方法,但没有成功。

这里是一个例子:

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 个答案:

答案 0 :(得分:1)

如果您知道总是会有4组,可以玩zipiter

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')]

答案 1 :(得分:0)

我认为使用内置字符串方法.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']]

这适用于任意大小的列表。

答案 2 :(得分:0)

这是我的恳求:

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']]

答案 3 :(得分:0)

如果要使用正则表达式(正则表达式很酷)并且每个子列表中都有动态数量的项目,请尝试以下操作:

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)

答案 4 :(得分:0)

基于正则表达式的方法-因为您已经在使用正则表达式作为解决方案:

代码

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 link