0

我有一个按第一个列表对列表列表进行排序的函数。当我将函数与如下变量一起使用时:

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])))
4

3 回答 3

2

这里要理解两点:

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]]
于 2019-01-10T10:07:28.250 回答
0

只需将函数更改为接受列表列表,有问题吗?这段代码:

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

再次返回列表列表

于 2019-01-10T09:55:34.953 回答
0

正如 Georgy 所指出的,区别在于参数是生成器还是列表。我还想指出,这是一个使用和实践该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]]

您会注意到您必须将您的值传递maplist函数,因为map它返回一个地图对象,因此您必须将其转换为列表。

地图文档在这里。一个很好的例子是here

于 2019-01-10T10:31:19.010 回答