分割字符串的最佳方法

时间:2012-11-28 22:59:19

标签: python string list split list-comprehension

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

names = ["John Smith", "Rob Julian", "Eric Walls"]

我想只获得此列表中的名字。

我通过以下方式实现了这一目标:

first_names = [n.split(" ")[0] for n in names]

这给了我想要的结果。

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

4 个答案:

答案 0 :(得分:3)

是的,但不是真的。表现明智,你最好拥有你拥有的东西。

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并运行time n0;time n1; time n2; time n3; time 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

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

答案 1 :(得分:1)

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

first_names = [n.split()[0] for n in names]

有点令人敬畏。

阅读this

答案 2 :(得分:1)

我认为使用匿名函数和map函数会产生最佳性能:

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

first_names = map(first,names)

答案 3 :(得分:0)

我不会说它是更好,但这是另一种方法:

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