首页 > 解决方案 > python中的列表操作,列表中有3个列表

问题描述

我有一个列表列表 - 本质上

[ [[val1, val2...], [val3, val4...]...], [[val5, val6...], [val7, val8...]...], ...]  

在 python 上,打印得很漂亮,输出如下所示:

[[['a',
   'b',
   'c',
   'test1',
   'd',
   'e',
   'f',
   'g'],
  ['h',
   'i',
   'j',
   'k',
   'l',
   'm']],
 [['n',
   'o',
   'p',
   'test2',
   'q',
   'r',
   's',
   't'],
  ['u',
   'v',
   'w',
   'x',
   'y',
   'z']]]

如何将 test1 和 test2 放入列表中,但作为两个单独的项目:

[ ['test1'], ['test2'] ]

这似乎很容易,但我不确定如何使用列表理解或遍历列表来获得它,因为有些值包含 8 个实体,有些包含 6 个。

标签: pythonlist

解决方案


先试着先用英文写,再翻译成Python。

  • 你有一个顶级列表。你想要它的prof-name每个子列表中的。
  • 每个子列表有两个子子列表。您只需要第一个子列表。
  • 每个子子列表都有一堆字符串,6 个或 8 个。无论哪种方式,您只需要第四个。

这些中的每一个都很容易翻译成 Python:

  • 每个子列表:for sublst in lst.
  • 每个子列表的第一个元素:sublst[0].
  • 每个子子列表的第四个元素:sublst[0][3].

把它放在一起:

[sublst[0][3] for sublst in lst]

该英文描述适用于您的示例,因此该代码适用于您的示例。如果应用的规则集不正确,请提出一组不同的规则,它们将同样易于翻译。

例如,也许你不想要第四个,你想要那些以prof-?

在这种情况下:

  • 每个子列表。
  • 第一个子子列表。
  • 以 开头的子子列表的每个元素Prof-

最后一个有点棘手——我们不能只做element.startswith('Prof-'),因为有些元素是整数。所以让我们写一个函数:

def prof(element):
    return isinstance(element, str) and element.startswith('Prof-')

现在:

  • for sublst in lst
  • sublst[0]
  • for element in sublst[0] if prof(element)

把它放在一起:

[element for sublst in lst for element in sublst[0] if prof(element)] 

但也许这密集了。一旦你在理解中得到了三个从句,就很难推理了。也许我们应该先把它展平,然后过滤它:

elements = (element for sublst in lst for element in sublst[0])
profs = [element for element in elements if prof(element)]

有点长,但希望更容易理解。


推荐阅读