展平部分列表
Flatten parts of list
我有这段代码创建了一个大小为 3 的列表列表。问题是其中一些列表列表的大小为 1,并且以这种方式嵌套:
[[['b']]]
并在另一个列表中找到。无论如何,是否只展平列表列表的一部分以从嵌套中删除这些大小为 1 的列表(无论它们嵌套的程度如何)但将它们保留为列表?这里有 2 个例子:
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]
在您的第二个示例中,您在要展平的列表中有列表(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]
我有这段代码创建了一个大小为 3 的列表列表。问题是其中一些列表列表的大小为 1,并且以这种方式嵌套:
[[['b']]]
并在另一个列表中找到。无论如何,是否只展平列表列表的一部分以从嵌套中删除这些大小为 1 的列表(无论它们嵌套的程度如何)但将它们保留为列表?这里有 2 个例子:
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]
在您的第二个示例中,您在要展平的列表中有列表(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]