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的点后面的最后一部分列表)可以在一行中完成。谁有更好的解决方案?
答案 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)
>>> 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]