拆分字符串并使用Python将其保存到列表中
我有一个字符串,我在它的所有不同位置插入了一个空格,并将它们保存到一个列表中。现在,这个字符串列表中有空格,我想拆分这些字符串,并将输出放在一个列表中,当我这样做时,碰巧有多个列表在其中: 这是我正在处理的代码:拆分字符串并使用Python将其保存到列表中,python,string,python-3.x,list,split,Python,String,Python 3.x,List,Split,我有一个字符串,我在它的所有不同位置插入了一个空格,并将它们保存到一个列表中。现在,这个字符串列表中有空格,我想拆分这些字符串,并将输出放在一个列表中,当我这样做时,碰巧有多个列表在其中: 这是我正在处理的代码: 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
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新手,我不知道我缺少了什么
如果您有列表,谢谢
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 = " ".join(res).split()
输出:
['sans', 's', 'ans', 'sa', 'ns', 'san', 's']
解释
“”。join(res)
将把res
中的各个字符串连接起来,它们之间有一个空格。然后调用.split()
将把这个空白字符串重新分割成一个列表
EDIT:第二种方法不涉及中间变量res
,尽管这一方法并不那么容易:
cor = [var[:i/2+1] if i%2==1 else var[i/2:] for i in range(2*len(var)-1)]
基本上,您可以从正面和背面在构建子字符串之间切换。首先,您的
[res[i].split() for i in range (len(res))]
这是一种复杂的非音速方式,与此相同:
[r.split() for r in res]
现在。。。问题是您将r.split()
视为最终结果。您应该将其用作进一步处理的来源:
[s for r in res for s in r.split()]
您可以始终使用在res
中拆分每个字符串:
list(map(str.split, res))
其中:
[['sans'], ['s', 'ans'], ['sa', 'ns'], ['san', 's']]
然后,您可以使用展开列表:
list(chain.from_iterable(map(str.split, res)))
哪些产出:
['sans', 's', 'ans', 'sa', 'ns', 'san', 's']
您可以在一行中执行类似操作,而无需导入任何模块:
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']
最好不要一开始就构建
cor
。@StefanPochmann你是对的,还为此添加了一个例子。那不是我的意思。你仍然在建立这个列表(即使是以同样糟糕的方式)。@roganjosh与你的相比可能:-P@StefanPochmann哈哈,哦,得了吧,这得归结为一个timeit
,因为这个答案在简单性上甚至超过了列表:P@StefanPochmann他的回答可能是最好的(他得到了我的支持)但对于“python新手”来说,双重列表理解可能很难理解。@roganjosh但它比我们的快得多。@roganjosh是的,你在那里犯了一个大错误。我没有拼写“ph”:-。此外,没有计时代码,只是解决方案。这种方法似乎也很快,如图所示。@RoadRunner Withvar='sans'*1000
和n=40
看起来更好:。但有趣的是,德克尔的速度甚至更快。这似乎不对,所以我在本地独立地测试了它们(同样使用Python3.5),我的测试速度更快。然后我把我的移动到最后,你瞧,它变成了最快的。然后我把你的移动到了最后,它几乎成了最快的:。我想我将不得不停止在ideone上进行基准测试。似乎后期测试从早期测试中获益,提高了流程优先级。