在Python中不使用特定元素返回list的快速方法

2024-04-19 01:18:56 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一个任意顺序的信用卡诉讼清单:

suits = ["h", "c", "d", "s"]

我想返回一个没有'c'的列表

noclubs = ["h", "d", "s"]

有什么简单的方法可以做到这一点吗?


Tags: 方法列表顺序信用卡noclubssuits
3条回答

这个问题已经得到了回答,但我想指出的是,使用列表理解比使用.remove()慢得多。

我的机器上的一些配置文件(使用Python2.7.6)。

%%timeit
x = ['a', 'b', 'c', 'd']
y = x[:]  # fastest way to copy
y.remove('c')

1000000 loops, best of 3: 405 ns per loop

%%timeit
x = ['a', 'b', 'c', 'd']
y = list(x)  # not as fast copy
y.remove('c')

1000000 loops, best of 3: 689 ns per loop

%%timeit
x = ['a', 'b', 'c', 'd']
y = [n for n in x if n != 'c']  # list comprehension

1000000 loops, best of 3: 544 ns per loop

%%timeit
x = ['a', 'b', 'c', 'd']
i = x.index('c')
y = x[:i] + x[i + 1:]

1000000 loops, best of 3: 656 ns per loop

如果你用最快的方式复制一个列表(它不是很可读),你将比使用列表理解快36%。但是,如果使用list()类(更常见的是Pythonic类)复制列表,那么您将比使用列表理解慢26%。

真的,一切都很快。我认为可以提出这样的论点,即.remove()比list a list comprehension技术更具可读性,但它并不一定更快,除非您有兴趣放弃重复中的可读性。

在这种情况下,列表理解的最大优点是它更加简洁(即,如果您有一个函数出于某种原因从给定列表中删除一个元素,它可以在1行中完成,而另一个方法需要3行)一些可读性的代价)。另外,当您不知道要删除的元素是否真的在列表中时,使用列表理解会更好。当.remove()将抛出ValueError时,列表理解将按预期操作。

>>> suits = ["h","c", "d", "s"]
>>> noclubs = list(suits)
>>> noclubs.remove("c")
>>> noclubs
['h', 'd', 's']

如果不需要单独的noclubs

>>> suits = ["h","c", "d", "s"]
>>> suits.remove("c")
suits = ["h","c", "d", "s"]

noclubs = [x for x in suits if x != "c"]

相关问题 更多 >