【问题标题】:Break string into words and phrases将字符串分解为单词和短语
【发布时间】:2015-03-08 18:53:32
【问题描述】:

假设我有一个包含几个空格分隔的单词的字符串,例如

words = "foo bar baz qux"

如果我想要单词列表,我可以打电话给words.split() 并得到

['foo','bar','baz','qux']

但是如果我想得到每个单词每组(相邻的)单词,比如

['foo bar baz qux', 'foo bar baz', 'bar baz qux', 
'foo bar', 'bar baz', 'baz qux', 'foo', 'bar',
'baz', 'qux']

我该怎么办?我确信我可以编写一个丑陋的大函数,它接受一个像words 这样的字符串并遍历每组相邻元素以返回上述内容,但我有一种预感,有一种更优雅的方式来处理它。有吗?

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    相当“丑陋”并且带有itertools

    结合"Find all consecutive sub-sequences of length n in a sequence""concatenating sublists python"

    from itertools import chain
    
    words = "foo bar baz qux"
    
    w = words.split()
    print map(' '.join, chain.from_iterable(zip(*(w[i:] for i in range(i))) for i in range(1, len(w) + 1)))
    

    输出:

    ['foo', 'bar', 'baz', 'qux', 'foo bar', 'bar baz', 'baz qux', 'foo bar baz', 'bar baz qux', 'foo bar baz qux']
    

    不那么丑陋和纯粹的 Python:

    我找到了一个非常简短的解决方案 - 尽管它有两个嵌套的 for 循环。

    print [' '.join(w[i:j+1]) for i in range(len(w)) for j in range(i, len(w))]
    

    输出:

    ['foo', 'foo bar', 'foo bar baz', 'foo bar baz qux', 'bar', 'bar baz', 'bar baz qux', 'baz', 'baz qux', 'qux']
    

    【讨论】:

    • 其实我最喜欢纯Python路线,没想到。对于我的用例来说,两个 for 循环不会有太大问题。
    【解决方案2】:

    您可以使用用于自然语言处理的 nltk 库。例如

    from nltk.util import ngrams
    sentence = 'foo bar baz qux'
    
    adj = [3, 2, 1]
    for n in adj:
        print ngrams(sentence.split(), n) 
    

    【讨论】:

    • 我一直在寻找深入研究 nltk 的理由,但这(以及我尝试的几个变体)并没有产生预期的结果。 :-(
    【解决方案3】:

    第一原理方法(即,不需要导入任何东西)确实“丑陋”,但并不太“大”,真的……

    list = ['foo','bar','baz','qux']
    length = len(list)
    newlist = []
    for item in list:
        string = item
        newlist.append(item)
        # assuming we're not on the last element, there's more strings to add starting with this
        startfrom = list.index(item) + 1
        for i in range(startfrom, length):
            string = string + ' ' + list[i]
            newlist.append(string)
    
    print newlist
    

    结果

    ['foo', 'foo bar', 'foo bar baz', 'foo bar baz qux', 'bar', 'bar baz', 'bar baz qux', 'baz', 'baz qux', 'qux']
    

    【讨论】:

      猜你喜欢
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 2012-12-19
      • 2011-06-12
      • 1970-01-01
      • 2017-04-26
      相关资源
      最近更新 更多