问题描述
带有以下字符串:
string='10 11 12Line13 14 15LinePage16 17 18Line19 20 21LinePage'
这会将其分为页面和行:
stringsplit=[l.split('Line') for l in string.split("Page")]
结果:
[['10 11 12','13 14 15',''],['16 17 18','19 20 21',['']]
如何拆分Line元素(即单词),以便每个元素都可以访问:
stringsplit[0][0][0]
将显示10
。
解决方法
您可以使用地图
string = "10 11 12Line13 14 15LinePage16 17 18Line19 20 21LinePage"
stringsplit = [
list(map(lambda item: item.split(" "),l.split("Line"))) for l in string.split("Page")
]
# Output: [[['10','11','12'],['13','14','15'],['']],[['16','17','18'],['19','20','21'],[['']]]
但这很混乱,很难看。您可以执行其他功能。
def split(arr: list):
return list(map(lambda item: item.split(" "),arr))
string = "10 11 12Line13 14 15LinePage16 17 18Line19 20 21LinePage"
stringsplit = [split(l.split("Line")) for l in string.split("Page")]
这可能比大多数其他嵌套列表理解答案要干净得多,因为您可以知道发生了什么而无需计算括号和内容。
,您可以使用以下列表理解来过滤出空拆分:
string = '10 11 12Line13 14 15LinePage16 17 18Line19 20 21LinePage'
result = [[word for word in line.split() if word]
for page in string.split('Page') if page
for line in page.split('Line') if line]
print(result)
哪个产量
[['10',['16','21']]
,
您可以将列表理解升级为嵌套列表理解:
stringsplit = [
[l.split() for l in p.split("Line")]
for p in string.split("Page")
]
print(stringsplit[0][0][0]) # 10
如果要过滤空白行和页面:
stringsplit = [
[l.split() for l in p.split("Line") if l]
for p in string.split("Page") if p
]
,
您应该能够再次重新应用相同的逻辑以获得所需的结果。
testStr = '10 11 12Line13 14 15LinePage16 17 18Line19 20 21LinePage'
ans = [[line.split(' ') for line in page.split('Line')] for page in testStr.split('Page')]
# ans[0][0][0] = 10
,
对于嵌套结果
s='10 11 12Line13 14 15LinePage16 17 18Line19 20 21LinePage'
sp=[
[
[n for n in l.split(' ') if n]
for l in p.split('Line') if l
]
for p in s.split('Page') if p
]
# [[['10','15']],'21']]]
结果平坦
>>> sp=[
... n
... for p in s.split('Page') if p
... for l in p.split('Line') if l
... for n in l.split(' ') if n
... ]
>>> sp
['10','12','13','15','16','18','19','21']