【问题标题】:Custom slice from list of lists列表列表中的自定义切片
【发布时间】:2021-10-11 18:34:58
【问题描述】:

我有这份清单

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 - 为MAIN 中的每个子列表获取索引为 0 和从索引 5 到索引 8 的元素的列表 B,从而得到这个

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 正确输出的最佳方法是什么?感谢您的帮助。

【问题讨论】:

  • 你已经投入了大量的工作来问这个问题。我唯一的批评是你应该使用一个普通的python标签
  • B 有不同顺序的子列表,因为您使用的是集合。

标签: python python-3.x slice nested-lists


【解决方案1】:

您可以使用推导将切片应用于每个元素:

[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](又名x[0:1])创建一个单元素列表,而x[0] 将返回与标量相同的元素。任何索引n都可以通过这种方式重写为切片n:n+1

【讨论】:

  • 我只能说,太棒了!!非常感谢。看来我会从您的解决方案中学到很多东西,因为使用了几个概念。我正在将数据框应用于列表,但我已经尝试A 将元素作为列表和元组,它似乎在这两种方式中都有效。 df_A = pd.DataFrame(A, columns=columns_A)df_B = pd.DataFrame(B, columns=columns_B)。但是感谢分享如何将A 作为列表列表和A 作为元组列表。
  • 如果您使用的是数据框,则根本不应该将它们视为列表。这些都不适用于数据框。 pandas 的全部意义在于提供快速的批量处理,而无需运行显式循环或理解。
  • 我不确定我是否同意。我正在解析一个文件,然后将数据存储在列表中。完成列表后,我将转换为数据框以使用 pandas 功能打印它。是不是好办法呢?
  • @GerCas。那时我会使用熊猫来做所有事情
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多