创建没有特定数字的范围

时间:2014-08-18 17:06:29

标签: python range

我想从x创建一个范围0 ... n,而不包含列表y中的任何数字。我怎么能这样做?

例如:

n = 10
y = [3, 7, 8]
x = # Do Something

应该给出输出:

x = [0, 1, 2, 4, 5, 6, 9]

一种天真的方法是连接几个范围,每个范围跨越一组与y中的数字相交的数字。但是,我不确定Python中最简单的语法是什么。

3 个答案:

答案 0 :(得分:10)

您可以使用列表推导来过滤从0n的范围:range(n)从{{1}生成一个列表(或者,在Python 3中,一个生成器对象) } 0(包括两端):

n - 1

这会过滤掉x = [i for i in range(n) if i not in y] 范围内的所有数字。

您还可以将y替换为n并将[转换为生成器(您只能迭代一次,但对于(非常)大的(来说会更快) {1}} ]。此外,在Python 2中,您可以使用)而不是xrange来避免一次将整个范围加载到内存中。此外,特别是如果range是一个大型列表,您可以首先将其转换为y以使用 O(1)成员资格检查而不是 O(n) setlist个对象上。这样的版本可能看起来像

tuple

答案 1 :(得分:8)

hlt的回答是理想的,但我会快速建议使用set操作的另一种方法。

n = 10
y = [3, 7, 8]
x = set(range(n)) - set(y)

x将是set个对象。如果您确实需要x成为list,则只需撰写x = list(x)

请注意,Python中的集合的顺序不能保证特别是任何东西。如果需要订购,请记得排序。

答案 2 :(得分:0)

再加上上面的答案,这是我使用lambda函数的答案:

x = filter(lambda x: x not in y,range(n))