如何编写列表推导来创建集合列表?

emb*_*ert 1 python list-comprehension set

我试图创建的集列表[set([0]), set([1]), set([2]),..]使用

>>> [set(i) for i in range(9)]
Run Code Online (Sandbox Code Playgroud)

但它并不是很好

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
TypeError: 'int' object is not iterable
Run Code Online (Sandbox Code Playgroud)

如何使用列表推导创建该列表?可能吗?

Inb*_*ose 5

[set([0]), set([1]), set([2]),..]使用列表推导创建,您将使用:

>>> [{i} for i in range(5)] 
[set([0]), set([1]), set([2]), set([3]), set([4])]
Run Code Online (Sandbox Code Playgroud)

除非您在2.7版之前使用任何版本的Python,否则请使用:

>>> [set((i,)) for i in range(5)]
[set([0]), set([1]), set([2]), set([3]), set([4])]
Run Code Online (Sandbox Code Playgroud)

但是,创建一个集合列表似乎有点愚蠢,其中每个集合都是递增序列的单个整数.无论你想要完成什么,可能会以不同的方式做得更好,请参考XY问题,并确保你没有陷入这个问题.

根据您要完成的任务,可能有更好的方法来存储数据或执行您尝试执行的逻辑.

注意:

最初我写了[set([i]) for i in range(5)]但是在定时不同的选项之后,我意识到将整数转换为单项列表比将它转换为元组更浪费,所以我改变了我的答案,然后再次改变它以使用set literal,timing下面:

>python -mtimeit "[{i} for i in range(5)]"
1000000 loops, best of 3: 0.853 usec per loop

>python -mtimeit "[set((i,)) for i in range(5)]"
1000000 loops, best of 3: 1.64 usec per loop

>python -mtimeit "[set([i]) for i in range(5)]"
1000000 loops, best of 3: 1.87 usec per loop
Run Code Online (Sandbox Code Playgroud)

  • 除非OP使用的是非常旧的Python,否则`{{i} for i in range(5)]`也应该有效. (3认同)