Предположим, я хочу разбить следующий список на один символ.
mylist = [('dog', 'camel'), ('horse'), ('List_of_people_saved_by_Oskar'), 'mouse_bear', 'lion tiger rabbit', 'ant']
Это то, что я пробовал до сих пор:
L1 = [animal for word in mylist for animal in word.split('_')]
print(L1)
Результат должен выглядеть так:
'['dog', 'camel', 'horse', 'List', 'of', 'people', 'saved', 'by', 'Oskar', 'mouse', 'bear', 'lion', 'tiger' 'rabbit', 'ant']'
Но я получаю сообщение об ошибке:
AttributeError: 'tuple' object has no attribute 'split'
Вы можете использовать re.findall(r'[^_ ]+', word)
вместо этого, чтобы разделить слова подчеркивания или пробела. Также добавьте еще один уровень понимания, чтобы сгладить возможные кортежи строк:
import re
L1 = [animal for item in mylist for word in (item if isinstance(item, (tuple, list)) else (item,)) for animal in re.findall(r'[^_ ]+', word)]
L1
станет:
['dog', 'camel', 'horse', 'List', 'of', 'people', 'saved', 'by', 'Oskar', 'mouse', 'bear', 'lion', 'tiger', 'rabbit', 'ant']
re.findall(r'[^_ ]+', word)
?
aspect-oriented.program
. Как справиться с этим с помощью регулярного выражения re
. Вывод должен быть списком, имеющим ['aspect', 'oriented', 'program']
Ну вот более читаемый код, так как мне действительно не нравится идея иметь встроенный код независимо от того, насколько он эффективен или быстрее. Кроме того, вам может быть проще понять, и импорт библиотеки не требуется.
КОД:
mylist = [('dog', 'camel'), ('horse'), ('List_of_people_saved_by_Oskar'), 'mouse_bear', 'lion tiger rabbit', 'ant']
new_list = []
for items in mylist:
if type(items) == tuple:
for animals in items:
new_list.append(animals)
elif '_' in items:
new_animal = items.split('_')
for animals in new_animal:
new_list.append(animals)
elif ',' in items:
new_animal = items.split(',')
for animals in new_animal:
new_list.append(animals)
elif ' ' in items:
new_animal = items.split(' ')
for animals in new_animal:
new_list.append(animals)
else:
new_list.append(items)
print(new_list)
Выход:
['dog', 'camel', 'horse', 'List', 'of', 'people', 'saved', 'by', 'Oskar', 'mouse', 'bear', 'lion', 'tiger', 'rabbit', 'ant']
Вы просто перепутали то, что происходит.
[animal.split('_') for word in mylist for animal in word]
Там есть дополнительная проблема, что ("horse")
не является кортежем; ("horse",)
есть. Таким образом, ("horse")
просто "horse"
в круглых скобках, а for animal in word
будет перечислять отдельные буквы в "horse"
вместо того, чтобы вернуть вам одного "horse"
животного.
Если вы хотите разделить другие символы, чем _
, вы можете использовать re.split
и класс символов:
import re
[re.split(r'[_ ]', animal) for word in mylist for animal in word]
Если вы на самом деле предназначались для непарных животных, чтобы они не были кортежами, вам придется специально обрабатывать эти случаи:
[re.split(r'[_ ]', animal)
for word in mylist
for animal in (word if isinstance(word, tuple) else (word,))]
'_'
не единственный разделитель.