В списке, как разделить каждую строку (со смешанными специальными символами) в один символ?

1

Предположим, я хочу разбить следующий список на один символ.

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'
  • 0
    что считается специальным персонажем ?
  • 0
    Извините я вас не понял
Показать ещё 4 комментария
Теги:
string
list
python-3.x
nltk

3 ответа

2
Лучший ответ

Вы можете использовать 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']
  • 0
    Спасибо @blhsing. Что такое re.findall(r'[^_ ]+', word) ?
  • 0
    Предположим, у меня есть слово, похожее на это, например: aspect-oriented.program . Как справиться с этим с помощью регулярного выражения re . Вывод должен быть списком, имеющим ['aspect', 'oriented', 'program']
Показать ещё 7 комментариев
1

Ну вот более читаемый код, так как мне действительно не нравится идея иметь встроенный код независимо от того, насколько он эффективен или быстрее. Кроме того, вам может быть проще понять, и импорт библиотеки не требуется.

КОД:

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

Вы просто перепутали то, что происходит.

[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,))]
  • 1
    это не похоже на работу. '_' не единственный разделитель.
  • 0
    @ Ev.Kounis К сожалению, я могу идти только по тому, что на самом деле написано в вопросе. Там был код; Я обратился к этому.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню