@ Ответ Ашвини идеален. Магия случается в
zip(*lis)
Позвольте мне объяснить, почему это работает: zip берет (в простейшем случае) два списка и «зипирует» их: zip([1,2,3], [4,5,6])
станет [(1,4), (2,5), (3,6)]
. Поэтому, если вы рассматриваете внешний список как матрицу, а внутренние кортежи - как строки, это транспонирование (т. Е. Мы превратили строки в столбцы).
Теперь zip
является функцией произвольной арности, поэтому она может принимать более двух аргументов:
# Our matrix is:
# 1 2 3
# 4 5 6
# 7 8 9
zip([1,2,3], [4,5,6], [7,8,9])
>>> [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
# Now it is
# 1 4 7
# 2 5 8
# 3 6 9
Проблема, с которой мы сталкиваемся, заключается в том, что в Не знаю, сколько аргументов мы хотим передать zip
. Но, по крайней мере, мы уже знаем аргументы: они являются элементами lis
! lis
- это список, и каждый элемент этого списка также является списком (соответствует одной строке чисел во входном файле). *
- это просто способ выражения функции Pythons «пожалуйста, используйте в качестве аргументов элементы всего, что следует, а не саму вещь!»
Итак
lis = [[1,2,3], [4,5,6]]
zip(*lis)
точно так же, как
zip([1,2,3], [4,5,6])
Поздравляю, теперь вы профессионал в Python! ; -)
Оберните его в делегат типа Func
с фиктивным возвращаемым значением, например
public static void Execute(Action<T> remoteCall)
{
Execute(t => { remoteCall(t); return true; });
}
вы буквально просите передать то, что не дает результата функции, которая его требует.
Это бессмысленно.
Вы можете легко преобразовать любую функцию формы Action
в Func
, если вы хотите предоставить какое-либо значение результата (неявно или явно)
Func<T,TResult> MakeDefault<T,TResult>(Action<T> action)
{
return t => { action(t); return default(TResult);};
}
или
Func<T,TResult> MakeFixed<T,TResult>(Action<T> action, TResult result)
{
return t => { action(t); return result; };
}