今天看到一个题,觉得很有意思,就是一个列表里面嵌套了几层列表,那么如何将他们全部转换到一个列表里?可能应用有限,但确实很有趣,实现方式也很多,适合用来拓展下思维。
需求
我们有一个嵌套列表,他是这个样子的:
a = [[1, 2], 3, [4, 5], 'a', 'b', 'c'] |
然后需要将其转为一维列表:a_new = [1, 2, 3, 4, 5, 'a', 'b', 'c']
方法一:递归
最简单的办法,就是递归。
- 把列表传进去
- 定义一个列表用来接收新的列表元素
- 开始循环遍历列表
- 如果当前元素不是列表,就直接附到新列表后面
- 如果当前元素为列表,进行递归操作
- 遍历结束后,返回新列表
def expand_list1(nested_list, em=[]):
for x in nested_list:
if type(x) != list:
em.append(x)
else:
expand_list1(x)
return em
方法二:生成器+递归
在上面递归的思想下,在使用生成器的方法,不是列表和元组的直接使用yield语法糖
,是列表或元组的直接递归即可。def expand_list2(nested_list):
for item in nested_list:
if isinstance(item, (list, tuple)):
for sub_item in expand_list1(item):
yield sub_item
else:
yield item
方法三:字符串替换
可能这种是最好理解的,但不是最容易想到的。惯性思维下,都会先考虑列表的操作。
思路就是:先转成字符串,匹配两端的方括号,再替换里面的方括号def expand_list2(nested_list):
return eval('[%s]' % repr(nested_list).replace('[', '').replace(']', ''))
方法四:列表推导式
说实话,这是第一种想到的办法,毕竟这个列表嵌套最多就有两层,但是失败了!看了报错,恍然大悟。我们的列表中,有个单独的int类型,他并不是一个可迭代对象。
a = [[1, 2], 3, [4, 5], 'a', 'b', 'c'] |
def expand_list4(nested_list): |
其实即使没有单独的int类型,还是可以实现需求的,但是,这样的话就会将字符串进行迭代,就是说如果有个单独的“abc”,也会被拆分成单独的字母。显然,这不是我们想要的效果。
这个题其实限制还是有点多,如果是单纯的数字,没有字符串的话,其实解法话有很多。
import itertools |
import numpy as np |