【问题标题】:How to split a nested list by \n but skip the the first one? Python如何通过 \n 拆分嵌套列表但跳过第一个? Python
【发布时间】:2019-07-11 19:22:02
【问题描述】:
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']
]

感谢您的帮助!

【问题讨论】:

  • 你能发布一个想要的输出吗?我不完全确定您是要跳过列表的第一个元素还是在每个循环中第一次出现\n
  • @Juan C 请看更新。

标签: python list split nested-lists


【解决方案1】:

没有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']]

【讨论】:

  • 谢谢。答案很好地解决了我的问题!顺便说一句,什么是 sum()?
  • @Jancos sum() 是 Python 的内置函数 docs.python.org/3.5/library/functions.html#sum 它将返回可迭代的总和作为第一个参数。注意这里的第二个参数,在本例中为[],即起始值。
【解决方案2】:

您可以遍历列表元素、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']]

【讨论】:

  • 您可以将第一个元素保留在 chain 中,如果您想将可迭代保持在一起可能会很好:list(chain(l[:1], *[i.split('\n') for i in l[1:]])
【解决方案3】:

编辑 - 这里只是一个列表理解,不需要导入:

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

这使用了@heemayl 的想法,我们可以特殊处理第一个元素,然后拆分所有其他元素,无论是否存在"\n"。这使得所有这些元素都变成了列表,因此我们在列表推导中使用另一个嵌套的 for 循环将每个元素展平。但这确实比您想立即进行的理解要多...

原文:

如果你愿意使用 for 循环,你可以这样做:

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

不过,我不知道这是否可以通过列表理解来完成;问题是您需要解压缩从拆分中获得的列表。但是,即使您可以通过理解来做到这一点,一旦您的逻辑变得非常复杂,我也不建议您使用它们。

【讨论】:

    【解决方案4】:

    等待找到通用方法,您可以使用以下方法:

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

    【讨论】:

      猜你喜欢
      • 2022-08-04
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      相关资源
      最近更新 更多