Как разделить вложенный список по \ n, но пропустить первый? питон - PullRequest
3 голосов
/ 11 июля 2019
my_list = [
    'Rob Kardashian\n 00052369 1987-03-17 Reality Star\nBrooke Barry 00213658 2001-03-30 TikTok Star',
    'John Lennon\n 02578913 1940-10-09 Singer',
    'Bae De Leon\n 00896351 1997-08-02 Volleyball Player\nJonas Blue 02369785 1990-08-02 Music Producer\nAlbert Einstein 65231478 1879-03-14',
    'Robert Downey\n Jr 23897410 1965-04-04 Actor'
]

У меня есть список выше, и я разделил его на числа, как показано ниже.

my_list_new = [re.split('\s(?=\d)|(?<=\d)\s', i) for i in my_list]

Выход:

[
    [ 'Rob Kardashian\n', '00052369','1987-03-17', 'Reality Star\nBrooke Barry', '00213658', '2001-03-30', 'TikTok Star'],
    ['John Lennon\n', '02578913', '1940-10-09', 'Singer'],
    ['Bae De Leon\n', '00896351', '1997-08-02', 'Volleyball Player\nJonas Blue', '02369785', '1990-08-02', 'Music Producer\nAlbert Einstein', '65231478', '1879-03-14'], 
    ['Robert Downey\n Jr', '23897410', '1965-04-04', 'Actor']
]

Следующий шаг: я хочу разделить my_list_new на '\ n', но пропустить первый.

Как использовать понимание списка для выполнения работы?

Ожидаемые результаты:

[
    ['Rob Kardashian\n', '00052369', '1987-03-17', 'Reality Star', 'Brooke Barry', '00213658', '2001-03-30','TikTok Star'],
    ['John Lennon\n', '02578913', '1940-10-09', 'Singer'],
    ['Bae De Leon\n', '00896351', '1997-08-02', 'Volleyball Player', 'Jonas Blue','02369785', '1990-08-02', 'Music Producer', 'Albert Einstein', '65231478', '1879-03-14'],
    ['Robert Downey\n Jr', '23897410', '1965-04-04', 'Actor']
]

Спасибо за вашу помощь!

Ответы [ 4 ]

3 голосов
/ 11 июля 2019

Без itertools:

lst = [['Rob Kardashian\n','00052369','1987-03-17','Reality Star\nBrooke Barry','00213658','2001-03-30','TikTok Star'],
['John Lennon\n', '02578913', '1940-10-09', 'Singer'],
['Bae De Leon\n','00896351','1997-08-02','Volleyball Player\nJonas Blue','02369785','1990-08-02','Music Producer\nAlbert Einstein','65231478','1879-03-14'],['Robert Downey\n Jr', '23897410', '1965-04-04', 'Actor']]

lst = [sum(row, []) for row in [[l[:1], *[i.split('\n') for i in l[1:]]] for l in lst]]

from pprint import pprint
pprint(lst, width=250)

Печать:

[['Rob Kardashian\n', '00052369', '1987-03-17', 'Reality Star', 'Brooke Barry', '00213658', '2001-03-30', 'TikTok Star'],
 ['John Lennon\n', '02578913', '1940-10-09', 'Singer'],
 ['Bae De Leon\n', '00896351', '1997-08-02', 'Volleyball Player', 'Jonas Blue', '02369785', '1990-08-02', 'Music Producer', 'Albert Einstein', '65231478', '1879-03-14'],
 ['Robert Downey\n Jr', '23897410', '1965-04-04', 'Actor']]
1 голос
/ 11 июля 2019

Вы можете перебирать элементы списка, split на \n, выравнивать вложенные списки, используя itertools.chain, и объединять списки:

[l[:1] + list(itertools.chain(*[i.split('\n') for i in l[1:]])) for l in lst]   

Пример:

In [295]: lst = [['Rob Kardashian\n','00052369','1987-03-17','Reality Star\nBrooke Barry','00213658','2001-03-30','TikTok Star'], 
     ...: ['John Lennon\n', '02578913', '1940-10-09', 'Singer'], 
     ...: ['Bae De Leon\n','00896351','1997-08-02','Volleyball Player\nJonas Blue','02369785','1990-08-02','Music Producer\nAlbert Einstein','65231478','1879-03-14'],['Robert Downey\n Jr', '23897410', '19
     ...: 65-04-04', 'Actor']]                                                                                                                                                                              

In [296]: [l[:1] + list(itertools.chain(*[i.split('\n') for i in l[1:]])) for l in lst]                                                                                                                     
Out[296]: 
[['Rob Kardashian\n',
  '00052369',
  '1987-03-17',
  'Reality Star',
  'Brooke Barry',
  '00213658',
  '2001-03-30',
  'TikTok Star'],
 ['John Lennon\n', '02578913', '1940-10-09', 'Singer'],
 ['Bae De Leon\n',
  '00896351',
  '1997-08-02',
  'Volleyball Player',
  'Jonas Blue',
  '02369785',
  '1990-08-02',
  'Music Producer',
  'Albert Einstein',
  '65231478',
  '1879-03-14'],
 ['Robert Downey\n Jr', '23897410', '1965-04-04', 'Actor']]
1 голос
/ 11 июля 2019

РЕДАКТИРОВАТЬ - здесь только с пониманием списка, импорт не требуется:

[[inner_list[0]] + [split for item in inner_list[1:] for split in item.split("\n")] for inner_list in my_list]

Здесь используется идея @heemayl о том, что мы можем обработать первый элемент специально и просто разделить на все остальныеесть ли "\n" или нет.Это превращает все эти элементы в списки, поэтому мы сливаем каждый из них с другим вложенным циклом внутри понимания списка.Но это действительно больше пониманий, чем вы хотите сделать одновременно ...

ОРИГИНАЛ:

Если вы хотите использовать для циклов, вы можете сделать это так:

my_list = [
    [ 'Rob Kardashian\n', '00052369','1987-03-17', 'Reality Star\nBrooke Barry', '00213658', '2001-03-30', 'TikTok Star'],
    ['John Lennon\n', '02578913', '1940-10-09', 'Singer'],
    ['Bae De Leon\n', '00896351', '1997-08-02', 'Volleyball Player\nJonas Blue', '02369785', '1990-08-02', 'Music Producer\nAlbert Einstein', '65231478', '1879-03-14'], 
    ['Robert Downey\n Jr', '23897410', '1965-04-04', 'Actor']
]

for i, inner_list in enumerate(my_list):
    new_inner_list = []
    for j, item in enumerate(inner_list):
        if j > 0 and "\n" in item:
            new_inner_list.extend(item.split("\n"))
        else:
            new_inner_list.append(item)
    my_list[i] = new_inner_list

Я не знаю, можно ли это сделать с помощью понимания списка;проблема в том, что вам нужно будет распаковать списки, которые вы получите при выполнении раскола.Даже если вы можете сделать это с пониманием, я бы не советовал использовать их, когда ваша логика становится очень сложной.

0 голосов
/ 11 июля 2019

В ожидании поиска общего пути вы можете сделать это с помощью:

[re.split('\s(?=\d)|(?<=\d)\s|(?<!Rob Kardashian)\n', i) for i in my_list]
...