【问题标题】:Flatten parts of list展平列表的一部分
【发布时间】:2022-01-11 22:40:00
【问题描述】:

我有这段代码可以创建一个大小为 3 的列表。问题是其中一些列表的大小是 1 并且以这种方式嵌套:

[[['b']]]

并且在另一个列表中找到。无论如何,是否仅展平列表列表的一部分以从嵌套中删除这些大小为 1 的列表(无论它们如何嵌套),但将它们保持为列表?这里有两个例子:

d = [[['a']], 'to', ['b']]

会变成:

d = [['a'], 'to', ['b']]

d1 = [[['c']], 'from', [['a'], 'to', [['b']]]]

会变成:

d1 = [['c'], 'from', [['a'], 'to', ['b']]]

我尝试使用 isinstance 并查看列表是否嵌套,然后替换该索引处的值,但这并没有成功。相反,我的代码一直在替换所有值并展平列表,这不是我的意图。我只希望将大小为 1 的嵌套列表减少为单个列表。这是我的尝试:

for index, value in enumerate(d1):
    if isinstance(value, list) and len(value) == 1:
        d1[index] = d1[index][0]

【问题讨论】:

  • 你认为isinstance([], value) 是做什么的?试试isinstance(value, list)
  • @Mark 不平衡括号已修复,这是我的错误。
  • “它不起作用”不是有效的问题陈述。您很好地列出了预期结果,但没有列出构成“不工作”的实际行为
  • @learningtoprogram123。你误解了帖子。 isinstance([], list) 始终为真。 list 是类型或类。 [] 是您要测试的对象的示例。不用担心,这就是你学习的方式。
  • 现在您已经享有盛誉,通常会为好的答案投票(不仅仅是针对您自己的问题)。

标签: python list flatten


【解决方案1】:

在您的第二个示例中,您在列表中的列表(3 级嵌套)中包含要展平的列表。但是您的代码仅查看 2 级嵌套:d[index]d[index][0],因此您的解决方案仅适用于最外层的嵌套。同样,您的代码将在[[[[[1]]]]] 之类的输入上失败。要修复它,您需要概括您的解决方案,这样它就不需要知道或关心嵌套列表的深度。

这是一个使用递归函数的解决方案 - 这不是解决问题的唯一方法,但它是最容易推理出来的,IMO。

def flatten(lst):
    # base case: if input is not a list, just return it
    if not isinstance(lst, list):
        return lst

    if len(lst) == 1:
        if isinstance(lst[0], list):
            # if input is a 1 element list and that element is itself
            # a list, then flatten it
            return flatten(lst[0])
        # ...otherwise return the input, it's already flattened
        return lst

    # when there are multiple entries in the input, flatten each
    return [flatten(x) for x in lst]

【讨论】:

  • 谢谢,这是我遇到的主要问题。由于我的程序不知道嵌套的级别,所以它无法准确地获取列表中的值。因此,一个遍历整个列表的递归方案解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 2016-08-19
  • 2019-08-11
  • 1970-01-01
  • 2012-03-19
相关资源
最近更新 更多