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 的点之后的最后一部分的列表)可以在单行中完成。有人对此有更好的解决方案吗?
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 的点之后的最后一部分的列表)可以在单行中完成。有人对此有更好的解决方案吗?
a = [x.rsplit('.', 1)[-1] for x in la]
如果您试图在最后一个分隔符之后获取元素,使用rsplit()
with (第二个参数) 会更有效。maxsplit=1
得到一个(来自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']
使用列表理解:
>>> 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]
访问列表的最后一个索引。
我更喜欢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 的回答似乎证实了这一点。
尝试这个:
a = [i.split('.')[-1] for i in la]
使用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] 来获取最后一项。
使用 just str.split
, 将在 each 处拆分'.'
,这是低效且不必要的。
>>> 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
new = [i.split('.')[-1] for i in la]