我有以下内容:
a = ['hello there good friend']
我需要以下内容:
a = ['hello', 'there good', 'friend']
基本上我需要它,所以列表的最后一个索引和第一个索引用逗号分隔,而其余的是一个字符串。我已经尝试过为我的功能使用for循环,然而,它只是变成了一些非常混乱的东西,我认为这是反作用的。
答案 0 :(得分:5)
您应该使用split()
函数将其拆分,然后对结果进行切片。可能会有一些稍微简洁的方法,但我能想到的最简单的方法如下:
test = a[0].split()
result = [test[0], " ".join(test[1:-1]), test[-1]]
其中-1
代表列表的最后一个条目。
您可以在一行中交替执行(类似于inspectorG4dget的解决方案),但这意味着您要将字符串拆分三次而不是一次。
[a[0].split()[0], " ".join(a[0].split()[1:-1]), a[0].split()[-1]]
或者,如果您认为切片有点超过顶部(我这样做),您可以使用正则表达式,这可以说是比上述任何更好的解决方案:
import re
a = 'hello there good friend'
return re.split(' (.*) ', a)
>>> ['hello', 'there good', 'friend']
正如Ord所提到的那样,这个问题存在一些含糊之处,但对于样本案例,这应该可以正常工作。
就性能而言,gnibbler是正确的,正则表达式实际上慢了大约两倍,并且两个操作的复杂性都是O(n)
,所以如果性能是你的目标那么你会更好选择他的,但我仍然认为正则表达式的解决方案(在一个罕见的正则表达的胜利)比替代品更具可读性。以下是直接计时结果:
# gnibbler's tuple solution
>>> timeit.timeit("s='hello there good friend';i1=s.find(' ');i2=s.rfind(' ');s[:i1], s[i1+1:i2], s[i2+1:]", number=100000)
0.0976870059967041
# gnibbler's list solution
>>> timeit.timeit("s='hello there good friend';i1=s.find(' ');i2=s.rfind(' ');[s[:i1], s[i1+1:i2], s[i2+1:]]", number=100000)
0.10682892799377441
# my first solution
>>> timeit.timeit("a='hello there good friend'.split();[a[0], ' '.join(a[1:-1]), a[-1]]", number=100000)
0.12330794334411621
# regex solution
>>> timeit.timeit("re.split(' (.*) ', 'hello there good friend')", "import re", number=100000)
0.27667903900146484
答案 1 :(得分:3)
>>> [a[0].split(None, 1)[0]] + [a[0].split(None, 1)[-1].rsplit(None, 1)[0]] + [a[0].rsplit(None, 1)[-1]]
['hello', 'there good', 'friend']
答案 2 :(得分:1)
尽量减少临时字符串的创建。
>>> a = ['hello there good friend']
>>> s = a[0]
>>> i1 = s.find(' ')
>>> i2 = s.rfind(' ')
>>> s[:i1], s[i1+1:i2], s[i2+1:]
('hello', 'there good', 'friend') # as a tuple
>>> [s[:i1], s[i1+1:i2], s[i2+1:]]
['hello', 'there good', 'friend'] # as a list