Python嵌套列表切片提取去重生成指定列表A、B的实现方法求助
问题原因与最优实现
列表B错误原因
你写的列表B代码存在两个核心问题:
- 集合(set)是无序数据结构,集合运算后转换回列表会完全丢失原有元素顺序
- 集合会自动去重,当子列表存在和
z[1:5]重复的元素时会被误删,比如最后一项里的711同时出现在索引1和索引6的位置,集合相减就会把索引6的711也删掉,导致元素缺失。
最优实现代码
列表A的现有逻辑完全符合要求可以直接使用,列表B直接按要求拼接指定索引的元素即可,既保留顺序也不会丢失元素,完整实现如下:
MAIN = [ ['ABC', '562', '112', '80', '231', '217', '433', '115', '10'], ['ABC', '562', '112', '80', '231', '322', '202', '432', '12'], ['ABC', '562', '112', '80', '231', '677', '133', '255', '64'], ['DEF', '711', '87', '319', '433', '981', '400', '100', '09'], ['DEF', '711', '87', '319', '433', '113', '210', '321', '51'], ['DEF', '711', '87', '319', '433', '921', '711', '991', '44'] ] # 列表A实现 A = [] for item in MAIN: prefix = item[:5] if prefix not in A: A.append(prefix) # 列表B实现:取索引0 + 索引5到8的元素(切片左闭右开,因此写为5:9) B = [] for item in MAIN: current = [item[0]] + item[5:9] B.append(current)
如果需要更简洁的写法,也可以用列表推导式实现:
# 列表A简洁版(Python 3.7+ 字典保留插入顺序,结果和预期完全一致) A = list({tuple(item[:5]): item[:5] for item in MAIN}.values()) # 列表B简洁版 B = [[item[0]] + item[5:9] for item in MAIN]
内容的提问来源于stack exchange,提问作者Ger Cas
相关产品推荐
相关产品推荐

