循环两个列表列表

时间:2013-04-10 14:29:16

标签: python

我需要循环浏览这个列表,但是我对此感到困惑。

这是我的代码:

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

我该怎么做?我尝试了几种循环和循环方式,它没有用。

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

你需要做两件事:

  1. 合并您的列表
  2. 生成两个列表的产品
  3. 对后者使用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')]
    

答案 2 :(得分:0)

如果循环列表索引而不是列表项,这种问题很容易解决。例如,您可以执行以下操作:

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