来自列表列表的自定义切片

Custom slice from list of lists

我有这个列表

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']
       ]

我想从 MAIN 列表中生成 2 个列表。

1- 首先获取列表 A,对于 MAIN 中的每个子列表,该列表的元素从索引 0 到索引 4,结果是

A = [ 
     ['ABC', '562', '112', '80', '231'],
     ['ABC', '562', '112', '80', '231'],
     ['ABC', '562', '112', '80', '231'],
     ['DEF', '711', '87', '319', '433'],
     ['DEF', '711', '87', '319', '433'],
     ['DEF', '711', '87', '319', '433']
    ]

并删除重复项以最终得到这个 A 列表:

A = [ 
     ['ABC', '562', '112', '80', '231'],
     ['DEF', '711', '87', '319', '433'],
    ]

2 - 获取列表 B,对于 MAIN 中的每个子列表,其元素的索引为 0,从索引 5 到索引 8,结果为

B = [
     ['ABC', '217', '433', '115', '10'],   
     ['ABC', '322', '202', '432', '12'],
     ['ABC', '677', '133', '255', '64'], 
     ['DEF', '981', '400', '100', '09'], 
     ['DEF', '113', '210', '321', '51'], 
     ['DEF', '921', '711', '991', '44']
    ]

目前低于我的尝试次数:

获取列表A

A = []
for z in MAIN:
    y = z[:5]
    if not (y in A):
        A.append(y)

获取列表B

B = []
for z in MAIN:
    B.append(list(set(z) - set(z[1:5])))

在下面的结果中,列表 A 似乎没问题,但列表 B 的子列表顺序不同,最后一个子列表缺少元素。

A = [
     ['ABC', '562', '112', '80', '231'], 
     ['DEF', '711', '87', '319', '433']
    ]

B = [
     ['217', '433', 'ABC', '10', '115'], 
     ['322', '202', '432', 'ABC', '12'], 
     ['255', '64', '677', 'ABC', '133'], 
     ['09', '100', '400', '981', 'DEF'], 
     ['113', '51', '210', '321', 'DEF'], 
     ['DEF', '44', '991', '921']
    ]

确保 AB 正确输出的最佳方法是什么?感谢您的帮助。

您可以使用理解对每个元素应用切片:

[x[:5] for x in MAIN]

据我所知,删除重复项的最佳方法是使用 set。但是,您不能向其添加列表,因此您必须将切片包装在一个元组中:

A = list(set(tuple(x[:5]) for x in MAIN))

如果您希望元素是列表而不是元组,则必须显式转换它们:

A = list(map(list, set(tuple(x[:5]) for x in MAIN)))

您不能依赖 set 为您创建切片,因为它不能保证顺序或保留重复项。相反,只需将切片附加在一起:

B = [x[:1] + x[5:9] for x in MAIN]

注意切片 x[:1] (a.k.a. x[0:1]) 创建一个单元素列表,而 x[0] 将 return 与一个标量。任何索引 n 都可以这样重写为切片 n:n+1