根据第二个参数对元组进行排序


92

我有一个看起来像这样的元组列表:

("Person 1",10)
("Person 2",8)
("Person 3",12)
("Person 4",20)

我要生成的是按元组的第二个值按升序排序的列表。因此L [0]应该("Person 2", 8)在排序之后。

我怎样才能做到这一点?使用Python 3.2.2如果有帮助。


Answers:


186

您可以将key参数用于list.sort()

my_list.sort(key=lambda x: x[1])

或者,稍微快一点

my_list.sort(key=operator.itemgetter(1))

(与任何模块一样,您将需要import operator能够使用它。)


3
我已尝试L.sort(key=operator.itemgetter(1))在代码中使用,但出现NameError,未定义“操作符”。我是否需要导入任何特殊内容?
user974703 2011年

3
做了一点搜索,需要使用import operator使用功能。如果您将其添加到答案中,则将其标记为接受。
user974703 2011年

使用timeit.timeit(默认选项)进行测试,这两种方法之间没有太大差异:operator.itemgetter = 1.05µs,lambda = 1.25µs每次迭代
Noel Evans

感谢my_list.sort(key = operator.itemgetter(1))解决方案!!:)
aman_novice '16

1
如果您不
熟悉

12

如果您使用的是python 3.x,则可以sortedmylist上应用该函数 这只是@Sven Marnach上面给出的答案的补充。

# using *sort method*
mylist.sort(lambda x: x[1]) 

# using *sorted function*
sorted(mylist, key = lambda x: x[1]) 

这只是返回新列表的内置函数。您的答案对这里已经没有任何帮助,因为很明显,如果您想要一个新列表,可以使用sorted代替list.sort
miradulo

2
@SamuelNde我在这里向下滚动,因为我不确定该表达式是否适用于排序,因此对我有帮助。
Red Riding Hood

是的,这也对我有帮助
StackG

-1
    def findMaxSales(listoftuples):
        newlist = []
        tuple = ()
        for item in listoftuples:
             movie = item[0]
             value = (item[1])
             tuple = value, movie

             newlist += [tuple]
             newlist.sort()
             highest = newlist[-1]
             result = highest[1]
       return result

             movieList = [("Finding Dory", 486), ("Captain America: Civil                      

             War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529), ("The  Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)]
             print(findMaxSales(movieList))

输出->侠盗一号


有两个想法:这实际上并不能回答问题(如何获取按元组中的值排序的列表);您可以直接在循环中打开元组的包装(对于电影,则为listoftuples中的值:);您已覆盖“元组”类型;实际上,可以通过单个列表理解来完成:(返回sorted((电影的(value,movie),listoftuples中的值)[-1] [1])
RFox

我很欣赏您的要求,但是我认为它缺乏优雅,可以改进。通常,将像这样的tupple中的元素顺序进行转换将被认为是较差的做法。我认为关于列表理解和拆包的问题仍然存在。我不鼓励任何使用这种方法的人接受公认的答案。
RFox

我没有能力,无法使您发布的代码正常工作,很可能是用户错误
Darrell White

但稍加更改,无疑您的答案会好200倍。
达雷尔·怀特

def findMaxSales(listoftuples):newlist = sorted(电影的(value,movies),listoftuples中的值)return newlist [-1] [1] movieList = [(“ Finding Dory”,486),(“”美国队长:内战“,408),(“死侍”,363),(“动物园”,341),(“流氓一号”,529),(“宠物的秘密生活”,368),(“蝙蝠侠对超人”,330 ),(“唱歌”,268),(“自杀小队”,325),(“丛林图书”,364)] print(findMaxSales(movieList))
Darrell White
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.