2016-07-07 135 views
0

在Python 2,假设排序拉链,我们有两个列表:的Python:根据长度和重量

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

我想基于下降列表2(权重),每当排序列表1的两个项目的权重是相同的(例如,x = [“A”,“B”,“D”]和y = [“B”,“D”]的重量都是10),长度较大的那个首先出现。对于列表1和表2,我所要的输出如:

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

这怎么可能?

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

zipped = zip(list1,list2) 

,然后仅基于大小对它们进行排序:

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

我想你的意思是你想根据list2排序'list1'而不是你写的方式。 –

+0

@BurhanKhalid你是对的。编辑。 –

+0

好的第一步。现在你有什么尝试其余的? – Julien

回答

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']] 
+0

伟大的思想思考。 :) –

+1

@ PM2Ring,当然,但这也是一个Python的禅宗的一部分:*“应该有一个 - 最好只有一个 - 明显的方法来做到这一点。”* :) – soon

+0

@soon谢谢,我didn不知道我们可以在“关键”中给出多个标准的事实。 –

3

你的关键功能需要告诉sort检查时list2权重是list1项目的长度相同。你可以做到这一点通过将关键的元组,像这样:

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) 
+0

@soon感谢您的完整回复。 –

相关问题