【问题标题】:Adding spaces to string based on list根据列表向字符串添加空格
【发布时间】:2019-10-11 19:38:48
【问题描述】:

我有一个字符串s 和一个字符串列表arrs 的长度等于arr 中字符串的总长度。 我需要将s拆分成一个列表,使得列表中的每个元素与arr中的对应元素的长度相同。

例如:

s = 'Pythonisanprogramminglanguage'

arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']
expected == ['Python', 'is', 'an', 'programming', 'language']

【问题讨论】:

  • 这个问题目前在 Meta 上 discussed

标签: python list split


【解决方案1】:

一种方法是这样做:

s = 'Pythonisanprogramminglanguage'

arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']

expected = []
i = 0
for word in arr:
    expected.append(s[i:i+len(word)])
    i+= len(word)

print(expected)

【讨论】:

    【解决方案2】:

    使用简单的 for 循环可以如下完成:

    s = 'Pythonisanprogramminglanguage'
    
    arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']
    
    start_index = 0
    expected = list()
    for a in arr:
        expected.append(s[start_index:start_index+len(a)])
        start_index += len(a)
    
    print(expected)
    

    【讨论】:

      【解决方案3】:

      创建一个简单的循环并使用单词的长度作为索引:

      s = 'Pythonisanprogramminglanguage'    
      arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']
      
      ctr = 0
      words = []
      for x in arr:
        words.append(s[ctr:len(x) + ctr])
        ctr += len(x)
      
      print(words)
      
      # ['Python', 'is', 'an', 'programming', 'language']
      

      【讨论】:

        【解决方案4】:

        将来,另一种方法是使用assignment expression(Python 3.8 中的新功能):

        s = 'Pythonisanprogramminglanguage'    
        arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']
        
        i = 0
        expected = [s[i:(i := i+len(word))] for word in arr]
        

        【讨论】:

          【解决方案5】:

          这是另一种方法:

          import numpy as np
          ar = [0]+list(map(len, arr))
          ar = list(np.cumsum(ar))
          output_ = [s[i:ar[ar.index(i)+1]] for i in ar[:-1]]
          

          输出

          ['Python', 'is', 'an', 'programming', 'language']
          

          【讨论】:

            【解决方案6】:

            另一种方法

            a,l = 0,[]
            for i in map(len,arr):
                l.append(s[a:a+i])
                a+=i
            print (l)
            #['Python', 'is', 'an', 'programming', 'language']
            

            【讨论】:

              【解决方案7】:

              iternext 一起使用更简洁:

              s = 'Pythonisanprogramminglanguage'
              arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']
              new_s = iter(s)
              result = [''.join(next(new_s) for _ in i) for i in arr]
              

              输出:

              ['Python', 'is', 'an', 'programming', 'language']
              

              【讨论】:

                【解决方案8】:

                您可以使用itertools.accumulate 来获取要拆分字符串的位置:

                >>> s = 'Pythonisanprogramminglanguage'
                >>> arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']
                >>> import itertools
                >>> L = list(itertools.accumulate(map(len, arr)))
                >>> L
                [6, 8, 10, 21, 29]
                

                现在如果你 zip 列表本身,你会得到间隔:

                >>> list(zip([0]+L, L))
                [(0, 6), (6, 8), (8, 10), (10, 21), (21, 29)]
                

                你只需要使用间隔来分割字符串:

                >>> [s[i:j] for i,j in zip([0]+L, L)]
                ['Python', 'is', 'an', 'programming', 'language']
                

                【讨论】:

                  【解决方案9】:

                  itertools 模块有一个名为 accumulate() 的函数(在 Py 3.2 中添加),这有助于使这相对容易:

                  from itertools import accumulate  # added in Py 3.2
                  
                  
                  s = 'Pythonisanprogramminglanguage'
                  arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']
                  
                  cuts = tuple(accumulate(len(item) for item in arr))
                  words = [s[i:j] for i, j in zip((0,)+cuts, cuts)]
                  print(words)  # -> ['Python', 'is', 'an', 'programming', 'language']
                  

                  【讨论】:

                    【解决方案10】:

                    使用iter 支持答案。积累的答案是我最喜欢的。这是另一个使用 map 而不是列表理解的累积答案

                    import itertools
                    
                    s = 'Pythonisanprogramminglanguage'
                    arr = ['lkjhgf', 'zx', 'qw', 'ertyuiopakk', 'foacdhlc']
                    ticks = itertools.accumulate(map(len, arr[0:]))
                    words = list(map(lambda i, x: s[i:len(x) + i], (0,) + tuple(ticks), arr))
                    

                    输出:

                    ['Python', 'is', 'an', 'programming', 'language']
                    

                    【讨论】:

                      【解决方案11】:

                      你可以收集s前面的切片。

                      output = []
                      
                      for word in arr:
                          i = len(word)
                          chunk, s = s[:i], s[i:]
                          output.append(chunk)
                      
                      print(output)  # -> ['Python', 'is', 'an', 'programming', 'language']
                      

                      【讨论】:

                        【解决方案12】:

                        另一种方法是创建一个正则表达式模式来描述所需的单词长度。您可以将每个字符替换为 .(=任何字符)并用 () 包围单词:

                        arr = ['lkjhgf', 'zx', 'q', 'ertyuiopakk', 'foacdhlc']
                        
                        import re
                        
                        pattern = '(' + ')('.join(re.sub('.', '.', word) for word in arr) + ')'
                        #=> '(......)(..)(.)(...........)(........)'
                        

                        如果模式匹配,您可以直接分组获得所需的单词:

                        s = 'Pythonisaprogramminglanguage'
                        re.match(pattern, s).groups()
                        #=> ('Python', 'is', 'a', 'programming', 'language')
                        

                        【讨论】:

                          猜你喜欢
                          • 2016-09-08
                          • 2013-12-21
                          • 2021-06-08
                          • 1970-01-01
                          • 2012-04-16
                          • 1970-01-01
                          • 1970-01-01
                          • 2021-08-26
                          • 2022-12-10
                          相关资源
                          最近更新 更多