Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
拆分字符串并使用Python将其保存到列表中_Python_String_Python 3.x_List_Split - Fatal编程技术网

拆分字符串并使用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 With
var='sans'*1000
n=40
看起来更好:。但有趣的是,德克尔的速度甚至更快。这似乎不对,所以我在本地独立地测试了它们(同样使用Python3.5),我的测试速度更快。然后我把我的移动到最后,你瞧,它变成了最快的。然后我把你的移动到了最后,它几乎成了最快的:。我想我将不得不停止在ideone上进行基准测试。似乎后期测试从早期测试中获益,提高了流程优先级。