2013-10-01 9 views
2

Я бы хотел перебирать два списка одновременно.Итерация по нескольким спискам одновременно в Python

Первый список - это обычный список элементов.

Второй список - это список, содержащий несколько списков, каждый из которых содержит элементы, которые на самом деле являются 3-мя кортежами.

Я хочу выполнить некоторую функцию для каждого элемента каждого 3-кортежа в каждом списке во втором списке (если это понятно). Эта функция будет зависеть от элемента в первом списке, и я бы хотел, чтобы все это выполнялось по порядку.

ie: Если у меня есть список, такой как [0,1,2,3,1,5,6,7,1,2,3,5,1,1,2,3,5,6] как мой первый список, а [[(13,12,32),(11,444,25)],[(312,443,12),(123,4,123)],[(545,541,1),(561,112,560)]] как мой второй список, я бы хотел выполнить такую ​​операцию, чтобы он включал первый элемент первого списка и первый элемент первого кортежа первого списка второго списка. Я бы хотел, чтобы эта операция повторялась с использованием n-го элемента первого списка, и n-й элемент кортежа bla bla

Итак, если мы посмотрим, какие элементы будут использоваться вместе для операции:

  • 0 идет с 13
  • 1 идет с 12
  • 2 идет с 32
  • 3 идет с 11
  • 1 идет с 444
  • 5 идет с 25
  • 6 идет с 312

и так далее.

Что происходит, так это то, что моя функция возьмет элемент из второго списка, его парный элемент из списка 1, каким-то образом использует эти биты и выдает новое значение, чтобы заменить его оригинал второго экземпляра списка. Затем я хочу построить заменяющий/новый «второй список», который является вторым списком после запуска этой функции (которая использует информацию, как описано выше)

Надеюсь, что это было полусогласованным, я старался быть таким информативным, как возможное. Пожалуйста, спросите, если что-то неясно.

Приветствия, и спасибо за любую помощь, которую вы можете предоставить!

Edit:

Я хочу взять список 1 и список 2, затем расплющить список 2. Затем я хочу, чтобы перебрать в обоих списках, используя какую-либо функцию. Затем я хочу построить новый список, в котором используются выходные данные из моей функции, которые будут просто «скорректированными» значениями для моего сплющенного второго списка, но в том формате, в котором он был изначально, кортежей в списке списка.

т.е. мой выход может быть что-то вроде:

[[(13,13,32),(11,444,24)],[(313,443,12),(123,4,123)],[(546,542,1),(561,112,561)]] 

с некоторыми из значений либо изменения немного или оставаться такими же, как и в результате того, что «прошло через» мою функцию.

Edit # 2:

галочкой решение точно показывает, что было необходимо для этой проблемы!

Edit # 3:

Несколько исправлений, которые необходимы для топового решения:
Как исправить код таким образом, что, если первый список пуст, то выход будет только оригинальной второй список? И если второй список пуст, вывод должен быть просто пустым. Также, если len (список 1)> len (список 2), он будет просто перебираться до конца списка 2, а затем игнорировать избыток в списке 1, выводя новый список того же формата, что и исходный список 2. И если len (список 2)> len (список 1), он будет просто перебираться, когда список 1 может быть сопоставлен, но оставить оставшуюся часть списка 2 неповрежденной, а не отрубать ее.

Могу ли я выполнить все эти исправления с помощью некоторых циклов if/elseif/else?

EDIT: Я все еще пытаюсь исправить эти проблемы, которые могут быть разделены/постулированы как отдельный запрос. Я задал новый вопрос: https://stackoverflow.com/questions/19118641/making-a-function-only-run-for-certain-conditions-in-python, если кто-то заинтересован в помощи.

+0

Похоже, что вы действительно хотите сделать, это * flatten * второй список, а затем вы можете просто, например. 'zip' вместе с первым. –

+0

Итак, как только я сплющил второй список, используя один из методов, предложенных ниже, выполнил мою операцию с помощью элемента из каждого списка, как бы я создал несвязанную замену/новую версию моего второго списка из моих выведенных данных? –

+0

Это поможет вам в вашем примере выполнить эту работу самостоятельно и показать нам * точно, что вы хотите в конечном итоге. –

ответ

4

Вы можете использовать zip и itertools.chain вроде этого:

from itertools import chain 

first = [0, 1, 2, 3, 1, 5, 6, 7, 1, 2, 3, 5, 1, 1, 2, 3, 5, 6] 
second = [ 
    [(13, 12, 32), (11, 444, 25)], 
    [(312, 443, 12), (123, 4, 123)], 
    [(545, 541, 1), (561, 112, 560)] 
]  
zip(first, chain(*(chain(*second)))) 

UPDATE

def add(x, y): 
    return x + y 

# Flatten the second list 
second_flattened = list(chain(*(chain(*second)))) 

# There is probably a better way to achieve this 
foo = [add(x, y) for x, y in zip(first, second_flattened)] 

# If second is longer we should append unprocessed values 
if len(second_flattened) > len(first): 
    foo += second_flattened[len(foo): ] 

bar = [foo[i:i+3] for i in range(0, len(foo), 3)] 
second = [bar[i:i+2] for i in range(0, len(foo)/3, 2)] 
+0

Итак, если бы я хотел сказать, возьмите элементы из каждого списка, соедините их вместе, используйте их в некоторой функции, которая даст элемент для моей новой версии списка №2, затем поместите эти выходы в новую версию списка №2, как я могу решить такую ​​задачу? –

+2

Вы действительно попробовали код? Подсказка: результат 'zip' является итерируемым; попробуйте повторить его и посмотреть, что вы получаете.Я не понимаю, что вы подразумеваете под «помещением в новую версию списка № 2». –

+0

Я обновил ответ. – zero323

0

вы можете использовать что-то вроде этого, чтобы получить каждый элемент из второго списка:

from itertools import chain 
l=list(chain.from_iterable(list2)) 
1

Ваш второй список должен быть сглажены двумя уровнями:

import itertools 
flatten = itertools.chain.from_iterable 
for i, j in zip(list1, flatten(flatten(list2))): 
    # whatever 
0

Питона itertools содержит izip, который позволяет застегнуть произвольное количество списков, используя тот же синтаксис, что и почтовый индекс. т.е. izip(l1, l2, l3)

0

Сделайте это.

dict(zip(ListA, eval('[' + repr(ListB).replace('(', '').replace(')', \ 
'').replace('[', '').replace('[', '') + ']')) 

Я знаю, что это довольно долго, но он вернет словарь, содержащий требуемый результат.

Смежные вопросы