【发布时间】:2017-07-05 13:10:06
【问题描述】:
给定列表a = [1, 2, 2, 3] 及其子列表b = [1, 2] 找到一个以sorted(a) == sorted(b + complement) 的方式补充b 的列表。在上面的示例中,complement 将是[2, 3] 的列表。
使用列表推导很诱人:
complement = [x for x in a if x not in b]
或设置:
complement = list(set(a) - set(b))
但是,这两种方式都会返回complement = [3]。
一个明显的方法是:
complement = a[:]
for element in b:
complement.remove(element)
但这让人非常不满意,而且不是很Pythonic。我错过了一个明显的成语还是这样?
正如下面指出的那样,性能如何,这是O(n^2) 有没有更有效的方法?
【问题讨论】:
-
您可以从 *unsatisfying 选项创建列表理解。这会让它*令人满意吗?
-
看不出来怎么发!
-
我真的不明白它有什么un-Pythonic。它不是完全声明性的,但仍然非常可读。我会更关心性能,因为这将在 O(n^2) 中运行,这不是很好...
-
@JanHak 只是用未分配的
[complement.remove(element) for element in b]替换最后两行,但正如@Willem 所说,这与外观无关。这几乎是列表理解的 *hack,因为我们不是创建列表,而是简单地使用语法来做其他事情
标签: python list list-comprehension