我有一个包含名字和姓氏的列表,如下所示:
names = ["John Smith", "Rob Julian", "Eric Walls"]
我想只获得此列表中的名字。
我通过以下方式实现了这一目标:
first_names = [n.split(" ")[0] for n in names]
这给了我想要的结果。
但在我看来,这非常难看,有没有更好的方法来实现这个目标?
答案 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)
答案 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']