我有以下元组:
['Southampton', '9', '14', '13']
['Nottingham Forest', '8', '10', '17']
['Coventry City', '7', '4', '14']
['Blackburn Rovers', '4', '6', '14']
['Newcastle United', '24', '20', '10']
['FC Wimbledon', '21', '20', '11']
['Arsenal', '21', '19', '8']
我想在第2和第3列进行排序。所以我使用以下代码:
sorted_rank = sorted(temp_rank, key=itemgetter(1,2), reverse=True)
但是你可以看到第2列和第3列不是int,所以排序过程完成错误。我怎么能告诉python这些列是int而不是string?
我尝试了这个,但没有:
sorted_rank = sorted(temp_rank, key=itemgetter(1,int(2)), reverse=True)
答案 0 :(得分:6)
您必须指定自定义函数或lambda。
以下作品:
sorted_rank = sorted(temp_rank, key=lambda i: (int(i[1]), int(i[2])), reverse=True)
sorted_rank
成为:
[['Newcastle United', '24', '20', '10'],
['FC Wimbledon', '21', '20', '11'],
['Arsenal', '21', '19', '8'],
['Southampton', '9', '14', '13'],
['Nottingham Forest', '8', '10', '17'],
['Coventry City', '7', '4', '14'],
['Blackburn Rovers', '4', '6', '14']]
答案 1 :(得分:2)
def key_fct(tup):
return (int(tup[1]), int(tup[2]))
sorted_rank = sorted(temp_rank, key=key_fct, reverse=True)
答案 2 :(得分:1)
要理解为什么你尝试的不起作用,让我们确保你理解itemgetter(1, 2)
是什么。首先,itemgetter
是一个函数。但更重要的是,它是一个返回函数的函数,而返回的函数就是您用作排序的关键函数。要了解为什么尝试将字符串转换为int不起作用,让我们实现一个itemgetter
版本,它总是带有两个参数:
def itemgetter(i, j):
def fn(e):
return (e[i], e[j])
return fn
用作键的内容是内部函数fn
的返回值。你所做的是将j
转换为int,而不是e[j]
。为此,您必须捕获fn
的结果,执行强制转换,然后返回结果:
def keyfunc(e):
return tuple(int(x) for x in itemgetter(1, 2)(e))
然后你可以使用它正确地执行排序:
sorted_rank = sorted(temp_rank, key=keyfunc, reverse=True)