Python用点分割后得到最后一部分

时间:2013-10-08 18:24:43

标签: python

la = ["a.b.c.d", "a.b.c", "y.d.k", "z"]
a = []
for i in la:
    j = i.split('.')
    a.append(j[-1])
print a

显示d,c,k,z

我觉得得到a(来自la的点后面的最后一部分列表)可以在一行中完成。谁有更好的解决方案?

7 个答案:

答案 0 :(得分:10)

a = [x.rsplit('.', 1)[-1] for x in la]

如果您尝试在最终分隔符之后获取元素,则使用rsplit()maxsplit=1(第二个参数)会更有效。

答案 1 :(得分:2)

  

得到一个(来自la的点后面的最后一个部分的列表)可以在一个单行中完成。任何人都有更好的解决方案

这些目标可能彼此不一致。

但这是你可能在寻找的东西:

>>> la = ["a.b.c.d", "a.b.c", "y.d.k", "z"]
>>> a = [f.split('.')[-1] for f in la]
>>> a
['d', 'c', 'k', 'z']

答案 2 :(得分:2)

使用list comprehension

>>> la = ["a.b.c.d", "a.b.c", "y.d.k", "z"]
>>>
>>> [elem.split('.')[-1] for elem in la]
['d', 'c', 'k', 'z']

li[-1]访问列表的最后一个索引。

答案 3 :(得分:2)

我更喜欢str.rfind()切片:

>>> la = ["a.b.c.d", "a.b.c", "y.d.k", "z"]
>>>
>>> [s[s.rfind('.') + 1:] for s in la]
['d', 'c', 'k', 'z']

我认为此处无需使用split()或其变体。

看起来这比最有效的拆分解决方案要快一些:

>>> from timeit import timeit
>>> 
>>> setup = '''
... la = ["a.b.c.d", "a.b.c", "y.d.k", "z"]
... '''
>>> 
>>> timeit("[s[s.rfind('.') + 1:] for s in la]", setup)
1.2622010707855225
>>> timeit("a = [x.rsplit('.', 1)[-1] for x in la]", setup)
1.6306350231170654

@hcwhsa's answer似乎证实了这一点。

答案 4 :(得分:2)

试试这个:

a = [i.split('.')[-1] for i in la]

答案 5 :(得分:1)

使用str.rsplit和列表理解:

>>> [x.rsplit('.', 1)[-1] for x in la]
['d', 'c', 'k', 'z']

str.rsplit('.', 1)只会在最后一个点处将字符串拆分一次,因此会返回:

>>> la[0].rsplit('.', 1)
['a.b.c', 'd']

现在您可以在此列表中使用[-1]来获取最后一项。

仅使用str.split,会在每个'.'处拆分,这是低效且不必要的。

>>> la[0].split('.')
['a', 'b', 'c', 'd']

时间比较:

>>> la = ["a.b.c.d"*10000, "a.b.c"*10000, "y.d.k"*10000, "z"*10000]*10000
>>> %timeit [s[s.rfind('.') + 1:] for s in la] #winner
1 loops, best of 3: 192 ms per loop
>>> %timeit [x.rsplit('.', 1)[-1] for x in la]
1 loops, best of 3: 750 ms per loop
>>> %timeit [f.split('.')[-1] for f in la]
1 loops, best of 3: 44.2 s per loop

答案 6 :(得分:1)

new = [i.split('.')[-1] for i in la]