Python创建列表从句子递增单词

时间:2014-01-04 00:11:52

标签: python list iteration combinations

如果我采用像“do re mi fa sol”这样的结构化句子并将其分解为单词。我怎么能以产生包含下面的列表的方式进行迭代?

示例:

           ['do', 're', 'mi', 'fa', 'sol'],
            do                  re              mi          fa      sol
            do re               re mi           mi fa       fa sol
            do re mi            re mi fa        mi fa sol
            do re mi fa         re mi fa sol
            do re mi fa sol

3 个答案:

答案 0 :(得分:1)

要创建所需的所有子列表,请尝试:

from itertools import chain, accumulate

def sublists(l):
    return chain.from_iterable(accumulate([s] for s in l[i:]) 
                               for i in range(len(l)))

output = list(sublists("do re mi fa sol".split()))

这给了我:

[['do'], ['do', 're'], ['do', 're', 'mi'], 
 ['do', 're', 'mi', 'fa'], ['do', 're', 'mi', 'fa', 'sol'], 
 ['re'], ['re', 'mi'], ['re', 'mi', 'fa'], ['re', 'mi', 'fa', 'sol'], 
 ['mi'], ['mi', 'fa'], ['mi', 'fa', 'sol'], 
 ['fa'], ['fa', 'sol'], ['sol']]

Documentation for the itertools module。请注意,accumulate是Python 3.2中的新增功能,但您可以在早期版本中使用Python实现。

答案 1 :(得分:0)

您应该使用split()功能。来自Python docs

  

str.split([sep [,maxsplit]]) - 使用sep作为分隔符字符串返回字符串中单词的列表...

<强>代码:

a = "do re mi fa sol"
a_list = a.split()
print a_list

<强>输出:

>>> ['do', 're', 'mi', 'fa', 'sol']

答案 2 :(得分:0)

你想要使用一套,所以你不要重复。

txt = """do re mi fa sol do re re mi mi fa fa sol do re mi re mi fa mi fa sol do re mi fa re mi fa sol do re mi fa sol"""

a = set(txt.split()) #splits on whitespace then casts to a set
#a == {'mi', 'sol', 'fa', 'do', 're'}

如果您需要保留订单,可以执行以下操作:

a = [value for i,value in
    enumerate(txt.split()) if value not in txt.split()[i+1:]]

但这比使用set()

慢得多

或许您正在尝试合并您的列表?尝试:

txt = """do re mi fa sol do re re mi mi fa fa sol do re mi re mi fa mi fa sol do re mi fa re mi fa sol do re mi fa sol"""

a = set(txt.split())
b = [' '.join(list(a[i:])) for i in range(len(a)]
#b == ['mi sol fa do re', 'sol fa do re', 'fa do re', 'do re', 're']