将多级列表列表展平为sing

2024-09-29 18:57:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将多级列表的所有级别展平:

import itertools

pool = [[[[[0,2],[1,3]],[[3,2],[1,0]]],"PdPd","PrisonerDilemma"], 
[[[[0,3],[1,2]],[[2,3],[1,0]]],"ShSh","StagHunt"],
[[[[1,2],[3,0]],[[3,2],[1,0]]],"ChCh","Chicken"],
[[[[2,1],[0,3]],[[3,1],[0,2]]],"BaBa","Battle"]]

def flat3 (pool):
    for game in pool:
        l = list(itertools.chain.from_iterable(game[0]))
        print(l)

结果是:

^{pr2}$

因此,目标是分离并返回每个项中的第一级,仅包含数字,例如:

[[[[[0,2],[1,3]],[[3,2],[1,0]]],"PdPd","PrisonerDilemma"]

然后我需要把所有的东西都平齐,比如:

[0,2,1,3,3,2,1,0]

我知道有很多关于这个主题的材料,我已经找到并尝试了很多方法,但是似乎没有一种方法可以在多个级别上工作,我想知道是否有一种有效的方法可以做到这一点,而不需要重复多次相同的命令。有人能帮我吗?在

谢谢你


Tags: 方法importgame列表级别poolitertoolschicken
3条回答

创建一个函数,该函数返回一个扁平化的数字列表。在

此函数获取一个列表并查看每个项。如果项目是数字,则将其添加到返回列表中。如果是列表,则在此列表上递归调用函数,并将返回的列表添加到调用函数的返回列表中。如果它是str或其他东西,则忽略该项。在

def flat(pool):
    res = []
    for v in pool:
        if isinstance(v, list):
          res += flat(v)
        else:
          if isinstance(v, int):
            res.append(v)
    return res  

demo

与往常一样,第一步是查看数据结构。在

el = [
         [
             [[0,2],[1,3]],
             [[3,2],[1,0]]
         ],
         "PdPd",
         "PrisonerDilemma"
     ]

这是结构中的每个单独元素。我们暂时忽略这个最外层的结构几乎肯定不应该是一个列表(在我看来它更像一个元组),而只关注我们所拥有的。在

^{pr2}$

现在我们把它简化成一个数字列表。这个我们可以做手术。在

def flatten(lst):
    for el in lst:
        if isinstance(el, list):  # N.B. this only works for lists, not general
                                  # collections e.g. sets, tuples, dicts, etc...
            # recurse
            yield from flatten(el)
        else:
            # generate
            yield el

结果就是将此函数应用于最外层列表中每个项的第一个元素。在

result = [flatten(sublst[0]) for sublst in big_list]

请注意,这将创建生成器对象的列表,需要使用这些对象才能实际生成值。如果出于某种原因确实需要列表本身,请显式强制转换为列表:

result = [list(flatten(sublst[0])) for sublst in big_list]

相关问题 更多 >

    热门问题