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