【问题标题】:Split string into list of two words, repeating the last word将字符串拆分为两个单词的列表,重复最后一个单词
【发布时间】:2019-01-11 02:15:42
【问题描述】:

我需要将一个字符串拆分为每两个单词的列表,但重复每对单词的最后一个单词。 以下是我尝试过的,通过使用我为其他问题找到的示例:

line = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."""

def split_line(in_line):
    line_sp = line.split(" ")
    line_two = [" ".join(line_sp[i:i + 2]) for i in range(0, len(line_sp), 2)]
    return line_two

print(split_line(line))

这会导致:

['Lorem ipsum', 'dolor sit', 'amet, consectetur', 'adipiscing elit,', 'sed do', 'eiusmod tempor', 'incididunt ut', 'labore et', 'dolore magna', 'aliqua.']

但我真正需要的是这个:

['Lorem ipsum', 'ipsum dolor', 'dolor sit', 'sit amet', 'amet, consectetur', 'consectetur adipiscing', ...]

我怎样才能让它工作? 谢谢!

【问题讨论】:

    标签: python string list split


    【解决方案1】:

    您可以从在line 中构建单词列表开始

    words = line.split()
    

    然后您可以创建一个列表列表,其中包含带有切片的结果对

    pairs = [words[i:i + 2] for i in range(len(words))]
    

    最后,你可以把每一对和' '联合起来

    result = [" ".join(pair) for pair in pairs if len(pair) > 1]
    

    【讨论】:

      【解决方案2】:

      您可以在以下两个词片上使用zip

      words = line.split()
      print(list(map(' '.join, zip(words[:-1], words[1:]))))
      

      这个输出:

      ['Lorem ipsum', 'ipsum dolor', 'dolor sit', 'sit amet,', 'amet, consectetur', 'consectetur adipiscing', 'adipiscing elit,', 'elit, sed', 'sed do', 'do eiusmod', 'eiusmod tempor', 'tempor incididunt', 'incididunt ut', 'ut labore', 'labore et', 'et dolore', 'dolore magna', 'magna aliqua.']
      

      【讨论】:

      • 您的解决方案中不会省略每个句子末尾的逗号,例如,请参阅输出中的单词“sit amet”。我想它必须是'sit amet'。
      【解决方案3】:

      您可以尝试类似的方法,我不知道 python 中的语法,所以在 java 中回答。 也许你可以把它转换成 python

      String line = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
          String[] split = line.split(" ");
          String [] line_two = new String[split.length-1];
      
          for (int i = 1; i < split.length; i++) {
              line_two[i-1] =split[i-1] +" "+split[i];
          }
      

      【讨论】:

        【解决方案4】:

        您可以使用带有 zip 的惰性生成器:

        def split_line(in_line):
            line_sp = line.split()
            yield from map(' '.join, zip(line_sp, line_sp[1:]))
        
        print(list(split_line(line)))
        
        ['Lorem ipsum', 'ipsum dolor', 'dolor sit', 'sit amet,',
         ...
         'labore et', 'et dolore', 'dolore magna', 'magna aliqua.']
        

        【讨论】:

          【解决方案5】:

          简单的for循环

          l = line.split(' ')
          result = []
          for i in range(len(l) - 1):
              result.append(l[i] + ' ' + l[i+1])
          print(result) 
          # ['Lorem ipsum', 'ipsum dolor', 'dolor sit', 'sit amet,', 'amet, consectetur', 'consectetur adipiscing', 'adipiscing elit,', 'elit, sed', 'sed do', 'do eiusmod', 'eiusmod tempor', 'tempor incididunt', 'incididunt ut', 'ut labore', 'labore et', 'et dolore', 'dolore magna', 'magna aliqua.', 'Lorem ipsum', 'ipsum dolor', 'dolor sit', 'sit amet,', 'amet, consectetur', 'consectetur adipiscing', 'adipiscing elit,', 'elit, sed', 'sed do', 'do eiusmod', 'eiusmod tempor', 'tempor incididunt', 'incididunt ut', 'ut labore', 'labore et', 'et dolore', 'dolore magna', 'magna aliqua.']
          

          【讨论】:

            【解决方案6】:

            你也可以用正则表达式试试:

            rslt=[ " ".join(tup) for tup in re.findall(r"(\w+)\W+(?=(\w+))",line) ]
            

            \w+ 一个或多个单词字符;

            (\w+) 我们捕获匹配的模式;

            \W+ 一个或多个非单词字符;

            (?=(\w+)) 向前看为 (?=...),但不要向前走,而是抓住下一个单词。

            【讨论】:

              【解决方案7】:

              你要找的是nltk.bigrams()

              import nltk
              bigrm = list(nltk.bigrams(line.split()))
              

              【讨论】:

              • 感谢您的建议。 Python 中的“nltk”是标准吗?
              猜你喜欢
              • 1970-01-01
              • 2015-12-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-06-01
              • 1970-01-01
              • 1970-01-01
              • 2016-01-18
              相关资源
              最近更新 更多