Python中列表对象使用很方便,用Python编程时,经常会遇到将多个长度相同的列表是针对某一组特定对象的,如何能方便的把这些列表组合起来一起使用呢?ZIP()函数可以方便的解决这个问题。
一、将几个长度相同的列表并列组合
例如,设置四个列表
ID = [1, 2, 3, 4]
Name = ['小红', '小蓝', '小黑', '小白']
Sex = ['F', 'M', 'M', 'F']
Weight = [90, 110, 180, 88]
由于上述四个列表均属于迭代对象,所以我们用可以用zip()函数把四个列表组合成一个整体。
merge = zip(ID, Name, Sex, Weight)
试着打印一下
For _ID, _Name, _Sex, _Weight in merge:
Print(_ID, _Name, _Sex, _Weight)
可以发现,通过zip合并后,各列表中的元素按顺序依次组合在一起了:
匹配的还是很完美的,但如果各列表长度不一样会怎样呢?
二、组合长度不一样的列表会怎样?
再设置一个长度为3的列表组合进去试试
cuo =[ 33,44,55]
mergex = zip(ID, Name, Sex, cuo)
for _ID, _Name, _Sex, _cuo in mergex:
print(_ID, _Name, _Sex, _Weight)
长度不一样也能行呢,只不过整体按最短列表的长度进行截取了
三、列表打包在一起再怎么分开?
能进能退才能自如,能打包能拆分,让人用起来才放心。
把多个列表组合成一个zip对象后,怎么再恢复为原有列表呢?首先还是要用zip()函数,不过需要在打包成的对象前面加*作为参数,用前面组合起来的merge对象为例。意外发生了:[0]都不行——IndexError,很明显貌似原先组合好的merge变成空的了……
(一)为什么zip会变空?
我:做好的zip为什么会变成空的,我只不过用了一次。
Python:没错,就是这样,因为你使用了一次,所以就空了
我:……,你好体贴,用完直接帮我帮我回收了
Python:没错,我就是这么棒~,出于优化内存的考虑,在python3中,zip()函数生成的zip对象只能访问一次,操作一次后,内存就会释放!!!(python2中可以访问多次).
我:咋感觉这叫坑呢,两个版本差别这么大,更坑……
(二)大不了再组装一个重新分,再次失败……
merge = zip(ID, Name, Sex, Weight)
for i in range(4):
print(list(zip(*merge)[i])
有忘记不能多次使用,居然用了循环,再次失败……
鉴于zip不耐用,必须一次性将zip转换为其他对象,我们再来……
(三)组装成zip后先转换成list,成功!
merge = zip(ID, Name, Sex, Weight)
alllist = list(zip(*merge))
for i in range(4):
print(alllist[i])
这次成功了,不过得到的是几个元组对象,因此还需要通过list函数处理一下。
(四)通过list函数把元组转换为列表
由于做好了能重复用的list——allist,终于不用重新做zip了~
for i in range(4):
print(list(alllist[i]))
终于成功了,就这样一个小函数,费这些事~
四、一点思考
(一)一个函数在使用前,一定要系统了解下,最好能测试一下,不然容易踩坑。
(二)函数不要想当然的乱用,遇到问题,如果扛一阵解决不了,就换种方式,别非硬碰硬,查找解决办法有时是解决问题最快的方式。这个函数比较简单,进坑易出,有些大坑你掉进去,你就试吧,你不去查找原因硬爬,不排除永远待在坑里的可能……