Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_List_Split_List Comprehension - Fatal编程技术网

Python 分割字符串的最佳方法

Python 分割字符串的最佳方法,python,string,list,split,list-comprehension,Python,String,List,Split,List Comprehension,我有一个包含名字和姓氏的列表,如下所示: names = ["John Smith", "Rob Julian", "Eric Walls"] 我只想知道名单上的名字 我通过以下行动实现了这一目标: first_names = [n.split(" ")[0] for n in names] 这给了我想要的结果 但在我看来,这很难看,有没有更好的方法来实现这一目标?我认为你的方法很棒,但是 first_names = [n.split()[0] for n in names] 有点可怕 阅

我有一个包含名字和姓氏的列表,如下所示:

names = ["John Smith", "Rob Julian", "Eric Walls"]
我只想知道名单上的名字

我通过以下行动实现了这一目标:

first_names = [n.split(" ")[0] for n in names]
这给了我想要的结果


但在我看来,这很难看,有没有更好的方法来实现这一目标?

我认为你的方法很棒,但是

first_names = [n.split()[0] for n in names]
有点可怕


阅读。

我认为你的方法很棒,但是

first_names = [n.split()[0] for n in names]
有点可怕


阅读。

是的,但不是真的。从性能上看,你拥有的东西会让你过得更好

first_names = []
for n in names:
    first_names.append(n.split()[0])
可以,但我喜欢python中的列表理解。我是说你怎么了

first_names = [n.split()[0] for n in names]
为了好玩,你也可以做以下事情。我可以想象,如果您正在处理一个非常大的列表,这可能会有最好的性能。但是,你可能想先调查一下

first = lambda n : n.split()[0]
first_names = [first(name) for name in names]
为了使其更全面,还可以使用lambda对其进行映射

first = lambda n : n.split()[0]
first_names = map(first,names)
根据评论,我添加了另一种方式

from operator import itemgetter
first_names = map(itemgetter(0), map(str.split, names))
总之,是的,还有其他的方法。 但你的原创似乎是最受欢迎的。若速度是一个问题,你们可能想修补其他问题

随时间更新 虽然不是最科学的,但我使用了大约350万个名字的列表,运行上面的调用文件n0-4并运行
timen0;时间n1;时间n2;时间n3;时间n4
这是我的结果。看起来原始列表的理解速度是我机器上最快的

real    0m8.433s
user    0m7.064s
sys     0m1.288s

real    0m8.213s
user    0m6.852s
sys     0m1.300s

real    0m8.581s
user    0m7.240s
sys     0m1.264s

real    0m8.374s
user    0m7.164s
sys     0m1.140s

real    0m11.890s
user    0m10.101s
sys     0m1.672s

(我以不同的顺序运行了几次,时间是一致的。)

是的,但不是真的。从性能上看,你拥有的东西会让你过得更好

first_names = []
for n in names:
    first_names.append(n.split()[0])
可以,但我喜欢python中的列表理解。我是说你怎么了

first_names = [n.split()[0] for n in names]
为了好玩,你也可以做以下事情。我可以想象,如果您正在处理一个非常大的列表,这可能会有最好的性能。但是,你可能想先调查一下

first = lambda n : n.split()[0]
first_names = [first(name) for name in names]
为了使其更全面,还可以使用lambda对其进行映射

first = lambda n : n.split()[0]
first_names = map(first,names)
根据评论,我添加了另一种方式

from operator import itemgetter
first_names = map(itemgetter(0), map(str.split, names))
总之,是的,还有其他的方法。 但你的原创似乎是最受欢迎的。若速度是一个问题,你们可能想修补其他问题

随时间更新 虽然不是最科学的,但我使用了大约350万个名字的列表,运行上面的调用文件n0-4并运行
timen0;时间n1;时间n2;时间n3;时间n4
这是我的结果。看起来原始列表的理解速度是我机器上最快的

real    0m8.433s
user    0m7.064s
sys     0m1.288s

real    0m8.213s
user    0m6.852s
sys     0m1.300s

real    0m8.581s
user    0m7.240s
sys     0m1.264s

real    0m8.374s
user    0m7.164s
sys     0m1.140s

real    0m11.890s
user    0m10.101s
sys     0m1.672s

(我以不同的顺序运行了几次,时间是一致的。)

我认为最好的性能是使用匿名函数和
map
函数:

first = lambda n : n.split()[0]

first_names = map(first,names)

我认为最好的性能是使用匿名函数和
map
函数:

first = lambda n : n.split()[0]

first_names = map(first,names)
我不认为这样更好,但这里有另一种方法:

>>> names = ["John Smith", "Rob Julian", "Eric Walls"]
>>> first = lambda x:x.split()[0]
>>> map(first, names)
['John', 'Rob', 'Eric']
我不认为这样更好,但这里有另一种方法:

>>> names = ["John Smith", "Rob Julian", "Eric Walls"]
>>> first = lambda x:x.split()[0]
>>> map(first, names)
['John', 'Rob', 'Eric']

这正是我要写的,除非我省略了
。如果你认为这很难看,试着用C写。这正是我要写的,除非我省略了
。如果你认为这很难看,试着用C写。这不是更快,而是很好的尝试
In[1]:%timeit first\u names=[first(name)for name In names]
<100000个循环,每个循环的最佳值为3:2.81 us
In[2]:%timeit[n.split()[0]for n In names]
在[3]中,每个循环的最佳值为3:2 us:%timeit map(itemgetter(0),map(str.split,names))
100000个循环,最佳3:3.79 us/循环
谢谢,我正要自己运行这些测试。我想我会克制自己,给自己拿些晚餐。使用
操作符.itemgetter(0)
比使用
lambda
:很好的摘要要好得多。你也应该看到它不是更快,而是很好的尝试
In[1]:%timeit first\u names=[first(name)for name In names]
<100000个循环,每个循环的最佳值为3:2.81 us
In[2]:%timeit[n.split()[0]for n In names]
在[3]中,每个循环的最佳值为3:2 us:%timeit map(itemgetter(0),map(str.split,names))
100000个循环,最佳3:3.79 us/循环
谢谢,我正要自己运行这些测试。我想我会克制自己,给自己拿些晚餐。使用
操作符.itemgetter(0)
比使用
lambda
:很好的摘要要好得多。你也应该看到