Как разделить вложенный список по подстроке? - PullRequest
0 голосов
/ 20 декабря 2018
a = [['dog===frog', 'cat===dog'], ['bird===bat', 'ball===call']]

Где len(a) может быть настолько большим, насколько необходимо, а len(a[I]) может быть настолько большим, насколько необходимо ..

как мне выйти b = [['dog','frog','cat','dog'],['bird','bat','ball','call']]?

Iпопробовал кое-что по линии

[' '.join(x).split('===') for x in new_list]

и просто общее понимание списка с помощью .join, но не повезло.

Ответы [ 6 ]

0 голосов
/ 20 декабря 2018
def flatten(seq):
    """list -> list                                                                                                                                                                           
    return a flattend list from an abitrarily nested list                                                                                                                                     
    """
    if not seq:
        return seq
    if not isinstance(seq[0], list):
        return [seq[0]] + flatten(seq[1:])
    return flatten(seq[0]) + flatten(seq[1:])

b=[[j.split("===") for j in i] for i in a]
c=[flatten(i) for i in b]
c
    [['dog', 'frog', 'cat', 'dog'], ['bird', 'bat', 'ball', 'call']]
0 голосов
/ 20 декабря 2018
import numpy as np
a = [['dog===frog', 'cat===dog'], ['bird===bat', 'ball===call']]
a = [ i.split('===') for i in np.array(a).ravel()]

Выход:

[['dog', 'frog'], ['cat', 'dog'], ['bird', 'bat'], ['ball', 'call']]
0 голосов
/ 20 декабря 2018

Вот одна строка, использующая понимание списка.

[[word for element in sublist for word in element.split('===')] for sublist in a]

0 голосов
/ 20 декабря 2018

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

from itertools import chain

[list(chain.from_iterable(s.split('===') for s in sub)) for sub in a]
# [['dog', 'frog', 'cat', 'dog'], ['bird', 'bat', 'ball', 'call']]
0 голосов
/ 20 декабря 2018

Вы можете использовать понимание вложенного списка :

a = [['dog===frog', 'cat===dog'], ['bird===bat', 'ball===call']]
result = [[chunk for chunks in map(lambda e: e.split('='), sub) for chunk in chunks if chunk] for sub in a]
print(result)

Выход

[['dog', 'frog', 'cat', 'dog'], ['bird', 'bat', 'ball', 'call']]
0 голосов
/ 20 декабря 2018

b = [sum([x.split('===') for x in sublist], []) for sublist in a]

должен дать вам то, что вы хотите.Работает так:

  • split('===') создает список из каждой строки
  • , затем вы добавляете их, используя сумму: sum([['dog', 'frog'], ['cat', 'dog']], []) в основном ['dog', 'frog'] + ['cat', 'dog']
  • sum([x.split('===') for x in sublist], []) использует понимание списка , чтобы создать разделенный список из всех частей небольшого списка (['dog===frog', 'cat===dog']), который передается в sum
  • , и все это заключено в другое понимание, которое выполняетсяэто для каждой части вашего большого списка a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...