【问题标题】:How to separate an enumerated list into a string python如何将枚举列表分离成字符串python
【发布时间】:2020-05-14 22:34:34
【问题描述】:

我想知道是否可以将枚举的字符串拆分为列表。这是我所拥有的:

"1 hello 2 goodbye 3 fun 4 etc"

并想将其转换为:

["1 hello", "2 goodbye", "3 fun", "4 etc"]

感谢您的帮助!

【问题讨论】:

    标签: python string list split


    【解决方案1】:

    除了@Mario Ishac 答案,如果您在 2 个数字之间有 2 个单词,您可以使用 regex 拆分数字:

    import re
    x = "1 hello world 2 goodbye 3 fun 4 etc"
    x = re.split(r'(\d+)', x)[1:]
    c = list(map("".join, zip(x[::2], x[1::2])))
    print(c) # ['1 hello world ', '2 goodbye ', '3 fun ', '4 etc']
    

    【讨论】:

      【解决方案2】:
      it = iter(s.split())  
      li = [a + ' ' + b for a,b in zip(it, it)]
      

      it = iter(s.split())  
      li = list(map(' '.join, zip(it, it)))
      

      li = list(map(' '.join, zip(*(2 * [iter(s.split())] )) ))
      

      zip 通常从迭代器中提取元素并按元素顺序将它们打包成元组,因此第一个元组包含所有第一个元素,第二个元组包含所有第二个元素,依此类推。但是在这种情况下 zip 两次获得相同的迭代器,因此对于每次迭代,都是从同一个迭代器中提取两次,这产生的不是元素编号 i, i 而是 i, i+1 这是“grouper”配方的一个特例,它你可以在这里找到:https://docs.python.org/3/library/itertools.html

      【讨论】:

      • 考虑到将迭代器自身压缩的惊人行为,解释一下这段代码的工作原理会很有帮助
      • zip 通常从迭代器中提取元素并按元素顺序将它们打包成元组,因此第一个元组包含所有第一个元素,第二个元组包含所有第二个元素,依此类推。但是在这种情况下 zip 两次获得相同的迭代器,因此对于每次迭代,都是从同一个迭代器中提取两次,这产生的不是元素编号 i, i 而是 i, i+1 这是“grouper”配方的一个特例,它你可以在这里找到:[docs.python.org/3/library/…
      • @angeldeluz777 用您在评论中写的解释更新您的答案。
      【解决方案3】:

      具有regexlist comprehension 的更强大的变体。 使用正则表达式(\d+\D+)re.findall() 可以拆分多个单词的枚举字符串。

      List comprehension 用于空格分割。

      import re 
      
      x = '1 hello world 2 goodbye 3 fun 4 etc'
      
      y = [c.strip() for c in re.findall(r"(\d+\D+)", x)]
      
      print(y)
      

      输出是

      ['1 hello world', '2 goodbye', '3 fun', '4 etc']
      

      【讨论】:

        【解决方案4】:

        你可以使用list comprehension:

        In [516]: x = "1 hello 2 goodbye 3 fun 4 etc"    
        In [517]: x = x.split(' ')
        
        In [519]: [" ".join(x[i:i+2]) for i in range(0, len(x), 2)]    
        Out[519]: ['1 hello', '2 goodbye', '3 fun', '4 etc']
        

        或使用regex

        In [520]: import re    
        In [521]: x = "1 hello 2 goodbye 3 fun 4 etc" 
        
        In [523]: re.findall("[^ ]+ [^ ]+", x)
        Out[523]: ['1 hello', '2 goodbye', '3 fun', '4 etc']
        

        【讨论】:

          【解决方案5】:

          这是使用zip的解决方案:

          a = "1 hello 2 goodbye 3 fun 4 etc"
          a = a.split()
          
          numbers = a[::2]
          words = a[1::2]
          
          b = [number + " " + word for number, word in zip(numbers, words)]
          

          b 最终成为 ['1 hello', '2 goodbye', '3 fun', '4 etc']

          您也可以这样分配b

          b = map(" ".join, zip(numbers, words))
          

          在这种情况下,b 是一个迭代器(并且连接操作是延迟应用的)。 list(b) 将是 ['1 hello', '2 goodbye', '3 fun', '4 etc']

          【讨论】:

            猜你喜欢
            • 2013-06-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-23
            相关资源
            最近更新 更多