Разбиение строки на список списков — Страница, строка, слово

#python #list #split #element

#python #Список #разделение #элемент

Вопрос:

Со следующей строкой:

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

Как разделить элемент строки (т. Е. Слова), чтобы каждый из них был доступен:

stringsplit[0][0][0] будет отображаться 10 .

Ответ №1:

Вы можете использовать map

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

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

Ответ №2:

Вы можете улучшить понимание списка до понимания вложенного списка:

 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
]
  

Комментарии:

1. Пошел с этим — большое спасибо. Очень умное и элегантное решение!

2. @jaycee Спасибо. Тогда вы можете пометить ответ как принятый.

Ответ №3:

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

 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
  

Ответ №4:

Вы могли бы использовать следующее понимание списка, которое отфильтровывает пустые разбиения:

 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', '11', '12'], ['13', '14', '15'], ['16', '17', '18'], ['19', '20', '21']]
  

Ответ №5:

Для вложенного результата

 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', '11', '12'], ['13', '14', '15']], [['16', '17', '18'], ['19', '20', '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', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21']