Python展开嵌套列表的五种方法

一、问题的提出

微信群中有人问,如何把以下内容转换成一个列表:

转换后:

"[["007674","工银产业升级股票A","GYCYSJGPA","1.3574"],["007675","工银产业升级股票C","GYCYSJGPC","1.3205"],["001719","工银国家战略股票","GYGJZLGP","2.25"]]"

转换后:

["007674","工银产业升级股票A","GYCYSJGPA","1.3574","007675","工银产业升级股票C","GYCYSJGPC","1.3205","001719","工银国家战略股票","GYGJZLGP","2.25"]

二、问题分析

实现上述转换,需要第一步是把字符串转换为列表,我们可以用eval()函数就可以了。然后我还要对嵌套列表进行遍历,对于一个一子列表进行解包,可以通过列表推导式,也可以通过星号或者用列表相加,或者集合合并等多种方法。

以上嵌套列表是标准的列表,如果不是标准的列表,我们还需要用isinstance()来判断是不是一个列表,如果是的话再展开操作,这里可能用到了递归的方法。

1. 列表推导式法

首先,这是一个嵌套列表,如果外面有双引号则是字符串,可以通过eval()来去除,再用列表推导式解决。

data = '[["007674","工银产业升级股票A","GYCYSJGPA","1.3574"],["007675","工银产业升级股票C","GYCYSJGPC","1.3205"],["001719","工银国家战略股票","GYGJZLGP","2.25"]]'
s=[]
print([item for ls in eval(data) for item in ls])

代码运行展示:

2. for 循环法

data = '[["007674","工银产业升级股票A","GYCYSJGPA","1.3574"],["007675","工银产业升级股票C","GYCYSJGPC","1.3205"],["001719","工银国家战略股票","GYGJZLGP","2.25"]]'
s=[]
for lst in eval(data):
   for ls in lst:
       s.append(ls)
print(s)

代码运行展示:

3. 可以用星号解包并输出

用一个星号来解包列表,代码如下。但是最终只是输出,并没有生成列表,不符号题目的要求。

data = '[["007674","工银产业升级股票A","GYCYSJGPA","1.3574"],["007675","工银产业升级股票C","GYCYSJGPC","1.3205"],["001719","工银国家战略股票","GYGJZLGP","2.25"]]'
s=[]
for lst in eval(data):
    print([*lst],sep=",",end="") 第一种方法

代码运行展示:

4. 列表相加法

简单的说就是把字符串转化为列表后,通过循环让里的元素相加。

lst = '[["007674","工银产业升级股票A","GYCYSJGPA","1.3574"],["007675","工银产业升级股票C","GYCYSJGPC","1.3205"],["001719","工银国家战略股票","GYGJZLGP","2.25"]]'
s=[]
for i in eval(lst):
    s+=i
print(s)

5. 集合求并集

把列表转为集合,利用求并集的方法来求合并合的集合,最后通过list转换为列表。

lst = '[["007674","工银产业升级股票A","GYCYSJGPA","1.3574"],["007675","工银产业升级股票C","GYCYSJGPC","1.3205"],["001719","工银国家战略股票","GYGJZLGP","2.25"]]'
s=set()
for i in lst:
    s= s|set(i)
print(list(s))

代码运行后的效果

三、注意事项

  1. 三种方法殊途同归,请有选择地使用。个人更喜欢列表表达式法,比较简洁,运行效率高。
  2. Python中我们可以用一个星号解包列表。但是星号解包不能用于列表推导式,所以说还是有点儿遗憾。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PythonFun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值