如何用Python按规则从P、C、storage_i生成列表R?能否用append?
问题描述
如何使用Python编写代码,按照给定规则从整数集合P、C以及索引集合storage_i生成输出列表R?是否可以使用append方法实现类似如下链式调用?
X.append(A[6]).append(B[1]).append(A[2])
若不可行,有什么替代方案?
相关集合
P = [1, 2, 3, 4, 5, 6] C = [101, 102, 103, 104, 105, 106]
注:P[1]指P的第一个元素1(非Python默认的0起始索引)
索引规则
storage_i是用于从P或C中选取元素生成R的索引集合,选取顺序固定为P->C->P->C->P,依次取用storage_i中的对应索引。
storage_i = [[6, 1, 2], [6, 1, 3], [6, 1, 4], [6, 1, 5], [6, 2, 3], [6, 2, 4], [6, 2, 5], [6, 3, 4], [6, 3, 5], [6, 4, 5], [1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 4], [1, 3, 5], [1, 4, 5], [2, 3, 4], [2, 3, 5], [2, 4, 5], [3, 4, 5], [6, 1, 2, 3, 4], [6, 1, 2, 3, 5], [6, 1, 2, 4, 5], [6, 1, 3, 4, 5], [6, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
目标R结构
R = [[P[6], C[1], P[2]], [P[6], C[1], P[3]], [P[6], C[1], P[4]], [P[6], C[1], P[5]], [P[6], C[2], P[3]], [P[6], C[2], P[4]], [P[6], C[2], P[5]], [P[6], C[3], P[4]], [P[6], C[3], P[5]], [P[6], C[4], P[5]], [P[1], C[2], P[3]], [P[1], C[2], P[4]], [P[1], C[2], P[5]], [P[1], C[3], P[4]], [P[1], C[3], P[5]], [P[1], C[4], P[5]], [P[2], C[3], P[4]], [P[2], C[3], P[5]], [P[2], C[4], P[5]], [P[3], C[4], P[5]], [P[6], C[1], P[2], C[3], P[4]], [P[6], C[1], P[2], C[3], P[5]], [P[6], C[1], P[2], C[4], P[5]], [P[6], C[1], P[3], C[4], P[5]], [P[6], C[2], P[3], C[4], P[5]], [1, 102, 3, 104, 5]]
预期结果
R = [[6, 101, 2], [6, 101, 3], [6, 101, 4], [6, 101, 5], [6, 102, 3], [6, 102, 4], [6, 102, 5], [6, 103, 4], [6, 103, 5], [6, 104, 5], [1, 102, 3], [1, 102, 4], [1, 102, 5], [1, 103, 4], [1, 103, 5], [1, 104, 5], [2, 103, 4], [2, 103, 5], [2, 104, 5], [3, 104, 5], [6, 101, 2, 103, 4], [6, 101, 2, 103, 5], [6, 101, 2, 104, 5], [6, 101, 3, 104, 5], [6, 102, 3, 104, 5], [1, 102, 3, 104, 5]]
解答
链式append的可行性说明
你提到的X.append(A[6]).append(B[1])这种链式调用不可行。因为Python中列表的append()方法返回值为None,而非列表本身,在None上调用append()会直接抛出AttributeError。
替代实现方案
根据规则,我们可以通过遍历storage_i的索引组,按P->C->P->C->P的交替顺序选取元素,具体实现步骤如下:
- 索引转换:题目中索引为1起始,Python列表为0起始,需将每个索引值减1获取对应元素;
- 交替选集合:按索引组内元素的位置(从0开始计数),偶数位置选P,奇数位置选C;
- 生成子列表并收集到R中。
实现代码
# 定义原始集合 P = [1, 2, 3, 4, 5, 6] C = [101, 102, 103, 104, 105, 106] storage_i = [[6, 1, 2], [6, 1, 3], [6, 1, 4], [6, 1, 5], [6, 2, 3], [6, 2, 4], [6, 2, 5], [6, 3, 4], [6, 3, 5], [6, 4, 5], [1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 4], [1, 3, 5], [1, 4, 5], [2, 3, 4], [2, 3, 5], [2, 4, 5], [3, 4, 5], [6, 1, 2, 3, 4], [6, 1, 2, 3, 5], [6, 1, 2, 4, 5], [6, 1, 3, 4, 5], [6, 2, 3, 4, 5], [1, 2, 3, 4, 5]] R = [] for indices in storage_i: sub_list = [] for idx_pos, num in enumerate(indices): # 偶数位置选P,奇数位置选C,转换为0起始索引 if idx_pos % 2 == 0: sub_list.append(P[num - 1]) else: sub_list.append(C[num - 1]) R.append(sub_list) # 打印验证结果 for item in R: print(item)
代码说明
- 外层循环遍历
storage_i中的每个索引组; - 内层循环通过
enumerate获取元素的位置和值,根据位置奇偶性选择对应集合,并完成1起始到0起始的索引转换; - 每个索引组处理后生成的子列表添加到R中,最终得到符合预期的结果。
内容的提问来源于stack exchange,提问作者Nicholas Nicholas
相关产品推荐
相关产品推荐

