В списке, как разделить каждую строку (со смешанными специальными символами) в один символ? - PullRequest
0 голосов
/ 16 октября 2018

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

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'

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Вместо этого вы можете использовать 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 голосов
/ 16 октября 2018

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

КОД:

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']
0 голосов
/ 16 октября 2018

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

[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,))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...