2
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 的点之后的最后一部分的列表)可以在单行中完成。有人对此有更好的解决方案吗?

4

7 回答 7

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

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

于 2013-10-08T18:26:22.790 回答
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']
于 2013-10-08T18:26:39.883 回答
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]访问列表的最后一个索引。

于 2013-10-08T18:26:44.573 回答
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 的回答似乎证实了这一点。

于 2013-10-08T18:26:55.943 回答
2

尝试这个:

a = [i.split('.')[-1] for i in la]
于 2013-10-08T18:27:00.490 回答
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] 来获取最后一项。

使用 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
于 2013-10-08T18:26:23.567 回答
1
new = [i.split('.')[-1] for i in la]
于 2013-10-08T18:29:10.320 回答