Python 如何对包含列表的元组进行排序?
我正在尝试建立一个基于内容的推荐系统 我创建了这个对象,它是一个包含字符串和元组列表的元组。列表中的每个元组都是一对分数值和项目id 我不知道如何按分数值排序这个对象Python 如何对包含列表的元组进行排序?,python,tuples,Python,Tuples,我正在尝试建立一个基于内容的推荐系统 我创建了这个对象,它是一个包含字符串和元组列表的元组。列表中的每个元组都是一对分数值和项目id 我不知道如何按分数值排序这个对象 ('100460040', [(0.424943345091376, '100460139'), (0.5341613659423828, '100462023'), (0.2915704982169979, '100464122'), (0.6915704982169979, '100461026')])
('100460040',
[(0.424943345091376, '100460139'),
(0.5341613659423828, '100462023'),
(0.2915704982169979, '100464122'),
(0.6915704982169979, '100461026')])
这就是我想要得到的结果
('100460040',
[(0.6915704982169979, '100461026'),
(0.5341613659423828, '100462023'),
(0.424943345091376, '100460139'),
(0.2915704982169979, '100464122')])
如果您的元组命名为
tpls
,则可以按如下方式对该元组中的所有列表进行排序
tuple(sorted(t, reverse=True) if type(t) == list else t for t in tpls)
# ('100460040', [(0.6915704982169979, '100461026'), (0.5341613659423828, '100462023'), (0.424943345091376, '100460139'), (0.2915704982169979, '100464122'), (0.2915704982169979, '100461025'), (0.27074189424335177, '100410120'), (0.1915704982169979, '100461066'), (0.10862458037004655, '100490118')])
给定一个输入元组
T
:
T_sorted = (T[0], sorted(T[1], reverse=True))
我们使用的事实是,元组在Python中是按元素自然排序的。换句话说,排序首先由每个元组的元素0执行,然后由元素1执行,以此类推。您只需对列表进行排序即可
In [1]: t = ('100460040',
...: [(0.424943345091376, '100460139'),
...: (0.5341613659423828, '100462023'),
...: (0.2915704982169979, '100464122'),
...: (0.6915704982169979, '100461026')])
...:
In [2]: t[1].sort(reverse=True)
In [3]:
In [3]: t
Out[3]:
('100460040',
[(0.6915704982169979, '100461026'),
(0.5341613659423828, '100462023'),
(0.424943345091376, '100460139'),
(0.2915704982169979, '100464122')])
您不需要额外的努力来按每个元组的第一个元素进行排序,因为元组是按字典顺序排序的。如果一对元组的第一个元素相同,则该算法只会查看第二个元素。嗯,列表是元组中的第二个元素,因此它有索引1。因此,您可以将该列表称为
t[1]
(假设您的元组名为t
;在实际代码中不是一个好名字)。您可以简单地使用以下方法进行排序:
t[1].sort()
但在这种情况下,您需要从高到低进行排序,因此需要
t[1].sort(reverse=True)
这是因为分数是列表中每个元组的第一个元素。如果不是这样,您还必须传递一个适当的
键
函数来排序()。您尝试了什么,它到底有什么问题?通读一下,它有一个与您的问题非常相似的例子。@MarcoFumagalli看着接近的投票,人们似乎不理解这个问题。你可以写“我有这个元组,包含一个元组和一个元组列表。我想按照每个元素的第一个元素对内部列表进行排序”。相反,您希望“按分数和值排序对象”,这一点不太清楚。一些反对票也可能来自那些重视OP最初尝试的人。好吧,我很快意识到这还不清楚。现在我觉得好多了。谢谢@timegb这里不需要键
或itemgetter
。@timgeb。是的。更新答案。谢谢