来自列表列表的自定义切片
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']
]
确保 A
和 B
正确输出的最佳方法是什么?感谢您的帮助。
您可以使用理解对每个元素应用切片:
[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
。
我有这个列表
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']
]
确保 A
和 B
正确输出的最佳方法是什么?感谢您的帮助。
您可以使用理解对每个元素应用切片:
[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
。