【问题标题】:Python Create List incrementing words from sentence [closed]Python创建列表从句子中增加单词[关闭]
【发布时间】:2014-01-04 00:11:52
【问题描述】:

如果我把像“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

【问题讨论】:

  • 不完全确定您的预期输出是什么。你要['do','re','mi','fa','sol']还是[ ['do','re','mi','fa','sol'], ['re','mi','fa','sol'], ['mi','fa','sol'], ['fa','sol'], ['sol'] (etc etc)]

标签: python list iteration combinations


【解决方案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 实现。

【讨论】:

    【解决方案2】:

    您应该使用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']
    

    【讨论】:

      【解决方案3】:

      你会想使用一个集合,这样你就不会重复了。

      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']
      

      【讨论】:

        猜你喜欢
        • 2021-02-10
        • 1970-01-01
        • 1970-01-01
        • 2020-01-18
        • 2014-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多