2013-04-10 78 views
-1

我需要遍历这个列表,但我得到一些混淆,使它。循环两个列表的列表

这是我的代码:

folders=[["Anim_2p.scn_c_DI_rig"],["Anim_2p.scn_c_TOTO_GALLO_rig"]] 
members = members=[["DI_CACHE.lengua","DI_CACHE.vidrios","DI_CACHE.dientes_abajo"],["TOTO_GALLO_cache.lengua","TOTO_GALLO_cache.dientes_01","TOTO_GALLO_cache.plumas_guantes"]] 

..这是期望的结果:

DI_CACHE.lengua Anim_2p.scn_c_DI_rig 
DI_CACHE.vidrios Anim_2p.scn_c_DI_rig 
DI_CACHE.dientes_abajo Anim_2p.scn_c_DI_rig 
TOTO_GALLO_cache.lengua Anim_2p.scn_c_TOTO_GALLO_rig 
TOTO_GALLO_cache.dientes_01 Anim_2p.scn_c_TOTO_GALLO_rig 
TOTO_GALLO_cache.plumas_guantes Anim_2p.scn_c_TOTO_GALLO_rig 

我怎样才能做到这一点?我尝试了几种方式循环和循环,但它没有工作。

+0

-1:这个问题被接受作为【答案】(http://stackoverflow.com/questions/15915146/looping-list-of-lists/15920005# 15920005) – Schorsch 2013-05-14 12:41:23

回答

0

你需要做两件事情:

  1. 合并您的清单
  2. 产生两个列表

产品使用itertools.product对于后者,zip前者。

from itertools import product 

for fs, ms in zip(folders, members): 
    for folder, member in product(fs, ms): 
     print ' '.join((member, folder)) 

主要生产:

>>> for fs, ms in zip(folders, members): 
...  for folder, member in product(fs, ms): 
...   print ' '.join((member, folder)) 
... 
DI_CACHE.lengua Anim_2p.scn_c_DI_rig 
DI_CACHE.vidrios Anim_2p.scn_c_DI_rig 
DI_CACHE.dientes_abajo Anim_2p.scn_c_DI_rig 
TOTO_GALLO_cache.lengua Anim_2p.scn_c_TOTO_GALLO_rig 
TOTO_GALLO_cache.dientes_01 Anim_2p.scn_c_TOTO_GALLO_rig 
TOTO_GALLO_cache.plumas_guantes Anim_2p.scn_c_TOTO_GALLO_rig 

回路可以折叠成一个列表理解:

from itertools import product 

combinations = [(member, folder) for fs, ms in zip(folders, members) for folder, member in product(fs, ms)] 

产生一个列表:

>>> [(member, folder) for fs, ms in zip(folders, members) for folder, member in product(fs, ms)] 
[('DI_CACHE.lengua', 'Anim_2p.scn_c_DI_rig'), ('DI_CACHE.vidrios', 'Anim_2p.scn_c_DI_rig'), ('DI_CACHE.dientes_abajo', 'Anim_2p.scn_c_DI_rig'), ('TOTO_GALLO_cache.lengua', 'Anim_2p.scn_c_TOTO_GALLO_rig'), ('TOTO_GALLO_cache.dientes_01', 'Anim_2p.scn_c_TOTO_GALLO_rig'), ('TOTO_GALLO_cache.plumas_guantes', 'Anim_2p.scn_c_TOTO_GALLO_rig')] 
+0

看起来他希望获得相应列表中的项目的产品,而不是将这两个列表的产品展平。也就是说,'zip(文件夹,成员)'将完成一半的工作。 – cdhowie 2013-04-10 14:36:39

+0

@cdhowie:啊,是的,我看到他们现在是如何组合的。 – 2013-04-10 14:43:24

1

你可以使用list comprehension

folders = [["Anim_2p.scn_c_DI_rig"],["Anim_2p.scn_c_TOTO_GALLO_rig"]] 
members = [["DI_CACHE.lengua","DI_CACHE.vidrios","DI_CACHE.dientes_abajo"],["TOTO_GALLO_cache.lengua","TOTO_GALLO_cache.dientes_01","TOTO_GALLO_cache.plumas_guantes"]] 
print('\n'.join([ 
    '{m} {f}'.format(m=member, f=folder) 
    for memberlist, folderlist in zip(members, folders) 
    for member in memberlist 
    for folder in folderlist])) 

产生

DI_CACHE.lengua Anim_2p.scn_c_DI_rig 
DI_CACHE.vidrios Anim_2p.scn_c_DI_rig 
DI_CACHE.dientes_abajo Anim_2p.scn_c_DI_rig 
TOTO_GALLO_cache.lengua Anim_2p.scn_c_TOTO_GALLO_rig 
TOTO_GALLO_cache.dientes_01 Anim_2p.scn_c_TOTO_GALLO_rig 
TOTO_GALLO_cache.plumas_guantes Anim_2p.scn_c_TOTO_GALLO_rig 

的列表解析等价于

result = [] 
for memberlist, folderlist in zip(members, folders): 
    for member in memberlist: 
     for folder in folderlist: 
      result.append('{m} {f}'.format(m=member, f=folder)) 

在列表中的项目可以被印刷(每行一个)与

print('\n'.join(result)) 
0

如果你在列表索引而不是列表项上循环,这种问题很容易解决。例如,你可以这样做:

for i in range(len(folders)): 
    for m in members[i]: 
     print(m, folders[i][0])