为何排序后的列表经itertools.cycle处理后生成的集合对不符合预期?
问题:循环生成的集合顺序不符合预期?
朋友优化后的Python代码如下:
from itertools import cycle list = sorted([8, 4, 6, 2]) c = cycle(list) u = [set(next(c) for _ in range(2)) for _ in range(6)] print(u)
运行后输出为:
[{2, 4}, {8, 6}, {2, 4}, {8, 6}, {2, 4}, {8, 6}]
我无法理解的是,列表已经排序,但第二组集合却始终是{8,6}。按照set(next(c) for _ in range(2))的逻辑,我预期输出应该是[{2, 4}, {6, 8}, {2, 4}, {6, 8}, {2, 4}, {6, 8}],想知道原因。
原因分析
先理清代码执行流程:
sorted([8,4,6,2])生成有序列表[2,4,6,8]cycle(list)会循环迭代这个列表的元素,顺序是:2 → 4 → 6 → 8 → 2 → 4 → 6 → 8……- 列表推导式中,每次调用
set(next(c) for _ in range(2))会连续取两个循环元素:- 第一次取2、4 → 集合
{2,4} - 第二次取6、8 → 集合内容为
{6,8}
- 第一次取2、4 → 集合
你看到的
{8,6}和预期的{6,8}是同一个集合——Python中的集合是无序结构,它不保证元素的存储或打印顺序。打印时的顺序只是Python内部的展示方式,不代表元素被添加的顺序,也不影响集合的实际内容。如果需要保留元素的顺序,不要用
set,改用list即可:u = [list(next(c) for _ in range(2)) for _ in range(6)]此时输出会是:
[[2, 4], [6, 8], [2, 4], [6, 8], [2, 4], [6, 8]]
内容的提问来源于stack exchange,提问作者unsafe_where_true
相关产品推荐
相关产品推荐

