【问题标题】:split and flatten tuple of tuples拆分和展平元组的元组
【发布时间】:2018-09-20 12:06:57
【问题描述】:

拆分和展平以下元组的最佳方法是什么?

我有这个元组:

(('aaaa_BBB_wacker*  cccc',), ('aaaa_BBB_tttt*',), ('aaaa_BBB2_wacker,aaaa_BBB',), ('BBB_ffff',), ('aaaa_BBB2MM*\r\naaaa_BBB_cccc2MM*',), ('BBBMM\\r\\nBBB2MM BBB',), ('aaaa_BBB_cccc2MM_tttt',), ('aaaa_BBB_tttt, aaaa_BBB',))

我需要: 按\n\、\r\、\n\、\r\、"、"、""分割

并将其展平。所以最终的结果应该是这样的:

['aaaa_BBB_wacker*','cccc', 'aaaa_BBB_tttt*','aaaa_BBB2_wacker','aaaa_BBB','BBB_ffff','aaaa_BBB2MM*','naaaa_BBB_cccc2MM*','BBBMM','BBB2MM BBB','aaaa_BBB_cccc2MM_tttt','aaaa_BBB_tttt', 'aaaa_BBB']

我尝试了以下方法,最终完成了这项工作,但我必须为每个模式重复多次。

patterns = [[i.split('\\r') for i in patterns]]
patterns = [item for sublist in patterns for item in sublist]
patterns = [item for sublist in patterns for item in sublist]
patterns = [[i.split('\\n') for i in patterns]]

【问题讨论】:

  • 如果您的解决方案有效,您希望它有何不同?通常做某事的最佳方式是行之有效的。
  • 除了贴出的答案之外,对于展平部分,请参阅itertools.chain.from_iterable...

标签: python list split flatten


【解决方案1】:

您应该使用正则表达式来拆分字符串:

import re
re.split(r'[\n\r, ]+', s)

使用循环会更容易:

patterns = []
for item in l:
  patterns += re.split(r'[\n\r, ]+', s)

【讨论】:

  • 请注意,除了'\r''\n',他还需要拆分'\\\r''\\\n'。您可以在该字符集中添加一个反斜杠,但我担心一个单独的反斜杠可能不会被正确地视为分隔符。
【解决方案2】:

给定

tups = (('aaaa_BBB_wacker*  cccc',), ('aaaa_BBB_tttt*',), 
    ('aaaa_BBB2_wacker,aaaa_BBB',), ('BBB_ffff',), 
    ('aaaa_BBB2MM*\r\naaaa_BBB_cccc2MM*',), ('BBBMM\\r\\nBBB2MM BBB',), 
    ('aaaa_BBB_cccc2MM_tttt',), ('aaaa_BBB_tttt, aaaa_BBB',))

import re
delimiters = ('\r', '\n', ',', ' ', '\\r', '\\n')
pat = '(?:{})+'.format('|'.join(map(re.escape, delimiters)))
result = [s for tup in tups for item in tup for s in re.split(pat, item)]

注释。在分隔符上调用 re.escape 可确保它们被正确地转义为您的正则表达式。 | 使它们成为替代品。 ?: 使您的分隔符组不被捕获,因此re.split 不会返回它。 + 表示匹配上一组一次或多次。

【讨论】:

    【解决方案3】:

    这是一个单行.. 但它并不简单。您可以在替换部分添加任意数量的项目,只需继续添加即可。

    start = (('aaaa_BBB_wacker*  cccc',), ('aaaa_BBB_tttt*',), ('aaaa_BBB2_wacker,aaaa_BBB',), ('BBB_ffff',), ('aaaa_BBB2MM*\r\naaaa_BBB_cccc2MM*',), ('BBBMM\\r\\nBBB2MM BBB',), ('aaaa_BBB_cccc2MM_tttt',), ('aaaa_BBB_tttt, aaaa_BBB',))
    
    output = [final_item for sublist in start for item in sublist for final_item in item.replace('\\r',' ').replace('\\n',' ').split()]
    

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 2020-10-04
      • 2014-02-19
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多