Выполнение функции выполняется только для определенных условий в python

G'day!

Таким образом, у меня есть функция, которая берет элементы из двух списков, первая из которых находится в стандартном формате списка, второй – список списков, внутренние списки, содержащие элементы в виде 3-х кортежей. Мой вывод – это новый список в формате второго списка, содержащий такое же количество элементов в одном и том же количестве внутренних списков, причем некоторые из значений слегка скорректированы в результате прохождения через функцию.

Вот пример кода и примерная функция, где цепочка импортируется из itertools. сначала есть список, например [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)]]

 def add(x, y): return x + y foo = [add(x, y) for x, y in zip(first, chain(*(chain(*second))))] 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)] 

* * Примечание. Часть Chain (chain ()) предназначена для следующей цели: потому что в целом сложнее обрабатывать список списка, содержащий 3-х кортежей. Цепочка (chain ()) просто сглаживается (в традиционный список отдельных элементов), второй список с вышеупомянутым «нечетным форматом». Остальная часть кода просто перестраивает новый список в исходный формат с выхода функции, которая уже находится в сплющенной форме.

Проблемы, которые у меня возникают, таковы:

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

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

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

Моя проблема в том, что я понятия не имею, как реализовать эти маленькие нюансы в моем коде. Любая помощь будет оценена по достоинству.

Привет, Джеймс

3 Solutions collect form web for “Выполнение функции выполняется только для определенных условий в python”

Не могли бы вы поместить первый список с None, где его недостаточно долго, и обрезать его там, где он слишком длинный.

то выполняем только функцию, где x не является None, иначе верните y

я попытался закодировать пример

 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)], [(13, 12, 32), (11, 444, 25)], [(312, 443, 12), (123, 4, 123)], [(545, 541, 1), (561, 112, 560)], ] def add(x, y): return x + y def pad(list,length): for i in range(length-len(list)): list.append(None) return list[0:length] first = pad(first,len(list(chain(*(chain(*second))) ))) # There is probably a better way to achieve this foo = [add(x, y) if x else y for x, y in zip(first, chain(*(chain(*second))))] 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)] print second 

поскольку zip только зацикливается на меньшем из двух списков, здесь он не слишком полезен. Вы можете создать свой собственный алгоритм, который применяет функцию к двум спискам так, как вы указываете:

 from itertools import * def flatten(seq): return list(chain(*(chain(*seq)))) def special_apply(a,b, func): """ applies a two argument function to the given flat lists. The result will have the same size as the second list, even if the first list is shorter. """ result = [] for i in range(len(b)): if i < len(a): element = func(a[i], b[i]) #if a ran out of elements, just supply an unmodified element of b else: element = b[i] result.append(element) return result def add(x,y): return x+y a = [1,1,1] b = [[(13,12,32),(11,444,25)],[(312,443,12),(123,4,123)],[(545,541,1),(561,112,560)]] foo = special_apply(a, flatten(b), add) bar = [foo[i:i+3] for i in range(0, len(foo), 3)] result = [bar[i:i+2] for i in range(0, len(foo) / 3, 2)] print result 

Результат:

 [[[14, 13, 33], [11, 444, 25]], [[312, 443, 12], [123, 4, 123]], [[545, 541, 1], [561, 112, 560]]] 

Я думаю, что это делает все, что вы хотите, если я понял все требования. Основное отличие от вашего кода заключается в том, что он также использует izip_longest() из itertools с пользовательским значением fillvalue , а не простой zip() . Он также просто проверяет специальные случаи, связанные с пустым списком входных данных в начале, что казалось проще, чем пытаться разработать методы составления списка или что-то еще для их обработки.

 from itertools import chain, izip_longest def add(x, y): return x + y def func(first, second): if not first: return second if not second: return [] second = chain(*(chain(*second))) # flatten foo = [add(x, y) for x, y in izip_longest(first, second, fillvalue=0)] bar = [tuple(foo[i:i+3]) for i in range(0, len(foo), 3)] return [bar[i:i+2] for i in range(0, len(foo) / 3, 2)] if __name__ == '__main__': 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)], [(13, 12, 32), (11, 444, 25)], [(312, 443, 12), (123, 4, 123)], [(545, 541, 1), (561, 112, 560)], ] print func(first, second) print print func(first[:-1], second) # 1st shorter, as many as poss, rest unchanged print print func(first, second[:-1]) # 2nd shorter, do only as many as in second 
  • Временно созданный во время итерации списка python?
  • Как указать 2 ключа в сортировке (списке) python?
  • преобразование списка целых чисел в диапазон в python
  • Оптимизация расчета расстояния Python при учете периодических граничных условий
  • Сложный список slice / index в python
  • Почему кортежи содержат изменчивые элементы?
  • Как создать неизвестное количество переменных в python
  • Используя Python, переверните целое число и сообщите, если палиндром
  • Python - лучший язык программирования в мире.