我想从x
创建一个范围0 ... n
,而不包含列表y
中的任何数字。我怎么能这样做?
例如:
n = 10
y = [3, 7, 8]
x = # Do Something
应该给出输出:
x = [0, 1, 2, 4, 5, 6, 9]
一种天真的方法是连接几个范围,每个范围跨越一组与y
中的数字相交的数字。但是,我不确定Python中最简单的语法是什么。
答案 0 :(得分:10)
您可以使用列表推导来过滤从0
到n
的范围: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) 在set
或list
个对象上。这样的版本可能看起来像
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))