Почему существует разница между list [0], list [1] ... и list [idx] для idx в диапазоне (x) при вызове функции? - PullRequest
0 голосов
/ 10 января 2019

У меня есть функция, которая сортирует список списков по первому списку. Когда я использую функцию с переменными, например, так:

sort_lists(IN[0],IN[1],IN[2])

работает отлично. Хотя, поскольку я не знаю, сколько списков содержит мой ввод, я хочу использовать это в качестве моей переменной:

sort_lists(IN[idx] for idx in range(len(IN)))

Хотя это возвращает сортировку одного списка (суперсписка). Почему есть разница между этими переменными, и как я могу улучшить код?

Вот функция, если она решающая (здесь IN [0] - вход с несколькими подсписками):

def sort_lists(*args):
    zipped_list= zip(*sorted(zip(*args)))
    return [list(l) for l in zipped_list]

OUT = sort_lists(data_sort[0],data_sort[1],data_sort[2])

Я хочу использовать этот вывод:

OUT = sort_lists(data_sort[idx] for idx in range(len(IN[0])))

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Здесь нужно понять две вещи:

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

def sort_lists(*args):
    print(args)
    zipped_list= zip(*sorted(zip(*args)))
    return [list(l) for l in zipped_list]

Пусть входной список списков будет: lists = [[2, 1, 3], [1, 3, 4], [5, 4, 2]].

sort_lists(lists[0], lists[1], lists[2])

напечатает: ([2, 1, 3], [1, 3, 4], [5, 4, 2]). Это кортеж внутренних списков.

Хотя, если вы называете это так:

sort_lists(lists[idx] for idx in range(len(lists)))

или

sort_lists(sublist for sublist in lists)

это напечатает (<generator object <genexpr> at 0x0000007001D3FBA0>,), одноэлементный кортеж генератора.

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

def sort_lists(arg):
    zipped_list= zip(*sorted(zip(*arg)))
    return [list(l) for l in zipped_list]

sort_lists(lists[idx] for idx in range(len(lists)))
# [[1, 2, 3], [3, 1, 4], [4, 5, 2]]

но я предлагаю оставить вашу функцию как есть, а распаковать ваши списки в том месте, где вы ее называете:

>>> sort_lists(*lists)
[[1, 2, 3], [3, 1, 4], [4, 5, 2]]
0 голосов
/ 10 января 2019

Как отметил Георгий, разница между аргументами является генератором или списком. Я также хотел бы отметить, что это возможность использовать и практиковать метод map. map применяет одну и ту же функцию к каждой записи в списке. Функция может быть встроенной, как sorted.

list_a = [[2, 1, 3], [1, 3, 4], [5, 4, 2]]
sorted_list_a = list(map(sorted, list_a)) # sorted is the python built-in function
print(sorted_list_a)

Возвращает:

[[1, 2, 3], [1, 3, 4], [2, 4, 5]]

Вы заметите, что вам придется передать map в функцию list, потому что map возвращает объект карты, поэтому вы должны превратить его в список.

Документация к карте находится здесь . И хороший пример этого здесь .

0 голосов
/ 10 января 2019

Просто измените функцию, чтобы принимать список списков, это проблема? Этот кусок кода:

IN[idx] for idx in range(len(IN))

снова возвращает список списков

...