2013-04-10 5 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

ответ

0

Вам нужно сделать 2 вещи:

  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 (folders, members)' будет выполнять половину работы. – cdhowie

+0

@cdhowie: Ах, да, я вижу, как они теперь объединены. –

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]) 
Смежные вопросы