如果你有多个列表,想要同时迭代它们,可以使用zip()
函数。zip()
函数可以将多个可迭代对象合并成一个元组的迭代器,然后你可以在循环中使用它。
问题背景
当需要在Python脚本中避免重复相同任务时,可以使用for循环来遍历列表。但是,如果有多个列表需要遍历,则需要逐个遍历它们,这会造成代码冗余。
例如,以下代码重复地遍历了多个列表:
ini
catlist1 = ['s0.05-k5-a1.0' , 's0.05-k5-a3.0' , 's0.05-k5-a7.0' , 's0.05-k5-a10.0' ]
catlist2 = ['s0.05-k7-a1.0' , 's0.05-k7-a3.0' , 's0.05-k7-a7.0' , 's0.05-k7-a10.0']
catlist3 = ['s0.07-k5-a1.0' , 's0.07-k5-a3.0' , 's0.07-k5-a7.0' , 's0.07-k5-a10.0' ]
catlist4 = ['s0.07-k7-a1.0' , 's0.07-k7-a3.0' , 's0.07-k7-a7.0' , 's0.07-k7-a10.0']
catlist = [catlist1 ,catlist2 ,catlist3 ,catlist4 ]
for parName in catlist1:
category = '/home/x/Desktop/rouge/ROUGE/Experiments/'
for root, subFolders, files in os.walk(category + parName):
#i = 0
(head, filename) = os.path.split(root)
print filename
#some function that is will re
for parName in catlist2:
category = '/home/x/Desktop/rouge/ROUGE/Experiments/'
for root, subFolders, files in os.walk(category + parName):
#i = 0
(head, filename) = os.path.split(root)
print filename
#some function that is will re
# ...
以上代码的重复性很强,不易维护。
解决方案
可以使用Python的itertools.chain.from_iterable()函数来将多个列表扁平化,然后可以使用for循环来遍历这个扁平化的列表。
ini
import itertools
catlist = [catlist1 ,catlist2 ,catlist3 ,catlist4 ]
for parName in itertools.chain.from_iterable(catlist):
category = '/home/x/Desktop/rouge/ROUGE/Experiments/'
for root, subFolders, files in os.walk(category + parName):
#i = 0
(head, filename) = os.path.split(root)
print filename
#some function that is will re
上面的代码就可以避免重复地遍历多个列表,简化了代码,提高了代码的可维护性。
另一种方法是使用嵌套循环,如下所示:
bash
for sublist in catlist:
for parName in sublist:
category = '/home/x/Desktop/rouge/ROUGE/Experiments/'
for root, subFolders, files in os.walk(category + parName):
#i = 0
(head, filename) = os.path.split(root)
print filename
#some function that is will re
上面的代码也可以实现同样的效果,但是在代码的可读性方面不如第一种方法。
代码例子
以下是一个使用itertools.chain.from_iterable()函数来将多个列表扁平化的代码例子:
ini
import itertools
catlist1 = ['s0.05-k5-a1.0' , 's0.05-k5-a3.0' , 's0.05-k5-a7.0' , 's0.05-k5-a10.0' ]
catlist2 = ['s0.05-k7-a1.0' , 's0.05-k7-a3.0' , 's0.05-k7-a7.0' , 's0.05-k7-a10.0']
catlist3 = ['s0.07-k5-a1.0' , 's0.07-k5-a3.0' , 's0.07-k5-a7.0' , 's0.07-k5-a10.0' ]
catlist4 = ['s0.07-k7-a1.0' , 's0.07-k7-a3.0' , 's0.07-k7-a7.0' , 's0.07-k7-a10.0']
catlist = [catlist1 ,catlist2 ,catlist3 ,catlist4 ]
for parName in itertools.chain.from_iterable(catlist):
print(parName)
输出结果如下:
s0.05-k5-a1.0
s0.05-k5-a3.0
s0.05-k5-a7.0
s0.05-k5-a10.0
s0.05-k7-a1.0
s0.05-k7-a3.0
s0.05-k7-a7.0
s0.05-k7-a10.0
s0.07-k5-a1.0
s0.07-k5-a3.0
s0.07-k5-a7.0
s0.07-k5-a10.0
s0.07-k7-a1.0
s0.07-k7-a3.0
s0.07-k7-a7.0
s0.07-k7-a10.0
这样,即使列表的长度不同,你也可以同时迭代它们。如果有不懂的可以留言一起讨论。