Python:根据长度和重量对zip进行排序

时间:2016-07-07 07:53:34

标签: python sorting

在Python 2中,假设我们有两个列表:

list1 = [["A"],["A","B"],["B","D"],["C"],["A","B","D"]]
list2 = [5,10,10,15,10]

我想基于list2(权重)按降序排序list1,并且只要两个项目的权重相同(例如x = [“A”,“B”,“D”]和y = [“ B“,”D“]的重量为10),长度较大的那个首先出现。对于list1和list 2,我希望输出如下:

[["C"], ["A","B","D"], ["A","B"],["B","D"],["A"]]

怎么可能?

我所知道的是,我们可以通过首先定义

来仅基于大小对它们进行排序
zipped = zip(list1,list2)

然后:

zipped.sort(key=lambda t: t[1],reverse=True)

2 个答案:

答案 0 :(得分:5)

为了按几个参数排序,您的key函数应该返回一个元组:

In [6]: sorted(zip(list1, list2), key=lambda x: (x[1], len(x[0])), reverse=True)
Out[6]: 
[(['C'], 15),
 (['A', 'B', 'D'], 10),
 (['A', 'B'], 10),
 (['B', 'D'], 10),
 (['A'], 5)]

key=lambda x: (x[1], len(x[0]))应该被理解为"首先按x [1]中的权重排序,然后按x [0]"中的列表长度排序

为了从每个元组中检索第一个元素,您可以将结果包装到列表解析中:

In [7]: [x[0] for x in sorted(zip(list1, list2), key=lambda x: (x[1], len(x[0])), reverse=True)]
Out[7]: [['C'], ['A', 'B', 'D'], ['A', 'B'], ['B', 'D'], ['A']]

答案 1 :(得分:4)

sort权重相同时,您的关键功能需要告诉list1检查list2项的长度。您可以通过将密钥设为元组来实现,如下所示:

list1 = [["A"],["A","B"],["B","D"],["C"],["A","B","D"]]
list2 = [5,10,10,15,10]

zipped = zip(list1,list2)

zipped.sort(key=lambda t: (t[1], len(t[0])), reverse=True)

print(list(zip(*zipped)[0]))

<强>输出

[['C'], ['A', 'B', 'D'], ['A', 'B'], ['B', 'D'], ['A']]

FWIW,这是一个可以在Python 3和Python 2中运行的版本。我之前的代码在Python 3中不起作用,因为Python 3 zip返回迭代器而不是列表。

zipped = zip(list1, list2)
zipped = sorted(zipped, key=lambda t: (t[1], len(t[0])), reverse=True)
newlist = [t[0] for t in zipped]
print(newlist)