【问题标题】:Split a string and save them to a list with Python拆分字符串并使用 Python 将它们保存到列表中
【发布时间】:2025-12-11 07:40:01
【问题描述】:

我有一个字符串,我在它的所有不同位置插入了一个空格并将它们保存到一个列表中。现在这个带有空格的字符串列表,我想拆分这些字符串并将输出放在一个列表中,当我这样做时,恰好里面有多个列表:

这是正在处理的代码:

var ='sans'
res = [var[:i]+' '+var[i:] for i in range(len(var))]
// The previous line: AM adding a space to see maybe that would generate other words
cor = [res[i].split() for i in range (len(res))]

这是我得到的输出:

>>> cor
[['sans'], ['s', 'ans'], ['sa', 'ns'], ['san', 's']]

期待什么:

>>> cor
    ['sans', 's', 'ans', 'sa', 'ns', 'san', 's']

我是 python 新手,我不知道缺少什么。

谢谢

【问题讨论】:

    标签: python string python-3.x list split


    【解决方案1】:

    另一种方法:

    cor = " ".join(res).split()
    

    输出:

    ['sans', 's', 'ans', 'sa', 'ns', 'san', 's']
    

    说明

    " ".join(res) 将连接res 中的各个字符串,它们之间有一个空格。然后调用.split() 会将空格上的这个字符串拆分回一个列表。

    编辑:第二种方法不涉及中间变量res,尽管这种方法看起来不太容易:

    cor = [var[:i/2+1] if i%2==1 else var[i/2:] for i in range(2*len(var)-1)]
    

    基本上你在从前面和后面构建子字符串之间切换。

    【讨论】:

    • @roganjosh 与你的相比可能:-P
    • @StefanPochmann 哈哈,哦,拜托,这将不得不归结为timeit,因为这个答案在简单方面甚至胜过 IMO 列表:P
    • @StefanPochmann 的答案可能是最好的(他得到了我的支持),但对于“python 新手”来说,双重列表理解可能很难理解。
    • @roganjosh 但它比我们的
    • @roganjosh 是的,你在那里犯了一个大错误。我没有用“ph”拼写:-)。此外,没有计时码,只有解决方案。
    【解决方案2】:

    首先,你的

    [res[i].split() for i in range (len(res))]
    

    是一种复杂的非pythonic方式来做同样的事情:

    [r.split() for r in res]
    

    现在...问题是您将r.split() 视为最终结果。您应该将其用作进一步处理它的来源:

    [s for r in res for s in r.split()]
    

    【讨论】:

    • 这种方法似乎也相当快,如here所见。
    • @RoadRunner var ='sans' * 1000n = 40 看起来更好:ideone.com/6dC8Rb。但有趣的是,Dekel 的速度甚至更快。这似乎不对,所以我在本地独立测试了它们(也使用 Python 3.5),我的速度更快。然后我把我的移到最后,你瞧,它变成了最快的:ideone.com/yYXRrn。然后我把 yours 移到最后,it 几乎变成了最快的:ideone.com/sN5Gnn。我想我将不得不停止对 ideone 进行基准测试。似乎后期测试受益于早期测试增加进程优先级左右。
    【解决方案3】:

    如果你有清单

    cor = [['sans'], ['s', 'ans'], ['sa', 'ns'], ['san', 's']]
    

    而你想把它展平,你可以使用以下:

    flat = [x for y in cor for x in y]
    

    输出将是:

    ['sans', 's', 'ans', 'sa', 'ns', 'san', 's']
    

    您也可以直接使用res 变量来实现:

    cor = [x for y in [res[i].split() for i in range (len(res))] for x in y]
    

    【讨论】:

    • 一开始最好不要构建cor
    • @StefanPochmann 你是对的,也为此添加了一个示例
    • 不,我不是这个意思。您仍在构建该列表(即使以完全相同的糟糕方式)。
    【解决方案4】:

    您总是可以使用map() 来分割res 中的每个字符串:

    list(map(str.split, res))
    

    这给出了:

    [['sans'], ['s', 'ans'], ['sa', 'ns'], ['san', 's']]
    

    那么你可以使用itertools.chain.from_iterable来展平列表:

    list(chain.from_iterable(map(str.split, res)))
    

    哪些输出:

    ['sans', 's', 'ans', 'sa', 'ns', 'san', 's']
    

    【讨论】:

      【解决方案5】:

      你可以在一行中做这样的事情而不导入任何模块:

      var ='sans'
      
      final=[]
      list(map(lambda x:list(map(lambda y:final.append(y),x)),[(var[i:]+' '+var[:i]).split() for i in range(0,len(var))]))
      print(final)
      

      输出:

      ['sans', 'ans', 's', 'ns', 'sa', 's', 'san']
      

      【讨论】: