在Python中使用zip函数对2个相关列表进行排序,如何按降序排序?

在Python中使用zip函数对2个相关列表进行排序,如何按降序排序?,python,Python,因此,我尝试对两个相关列表进行排序。一个包含候选人姓名,一个包含候选人拥有的票数(候选人在候选人[0]中的票数存储在票数[0]) 我找到了一种按降序排列投票[]的方法,同时保持索引匹配。例如,如果投票[0]变成投票[3],候选人[0]也会变成候选人[3]。我使用内置的zip函数实现了这一点,但我从中复制的示例按升序对列表进行排序,而我要求它们按降序排序。 以下是我的清单: candidates = ['Donald', 'Barack', 'Hillary', 'Mitt'] votes = [

因此,我尝试对两个相关列表进行排序。一个包含候选人姓名,一个包含候选人拥有的票数(候选人在
候选人[0]
中的票数存储在
票数[0]

我找到了一种按降序排列投票[]的方法,同时保持索引匹配。例如,如果
投票[0]
变成
投票[3]
候选人[0]
也会变成
候选人[3]
。我使用内置的
zip
函数实现了这一点,但我从中复制的示例按升序对列表进行排序,而我要求它们按降序排序。 以下是我的清单:

candidates = ['Donald', 'Barack', 'Hillary', 'Mitt']
votes = [9, 7, 1, 3]
为了对我使用的列表进行排序:

votes, candidates = (list(t) for t in zip(*sorted(zip(votes, candidates))))

这正是我想要的,除了升序,而不是降序。如何编辑此项以将列表按降序排序?

您可以对
列表的
zip
反向
进行排序

>>> votes = [9, 7, 1, 3]
>>> candidates = ['Donald', 'Barack', 'Hillary', 'Mitt']
>>> 
>>> sorted(zip(votes, candidates), key=lambda x: x[0]) # in ascending order
[(1, 'Hillary'), (3, 'Mitt'), (7, 'Barack'), (9, 'Donald')]
>>>
>>> sorted(zip(votes, candidates), key=lambda x: x[0], reverse=True) # in descending order
[(9, 'Donald'), (7, 'Barack'), (3, 'Mitt'), (1, 'Hillary')]

>>> # and if you want it back in order again;
>>> votes, names = zip(*sorted(zip(votes, candidates), key=lambda x: x[0], reverse=True))
>>> votes
(9, 7, 3, 1)
>>> names
('Donald', 'Barack', 'Mitt', 'Hillary')

使用
reverse=True

candidates = ['Donald', 'Barack', 'Hillary', 'Mitt']
votes = [9, 7, 1, 3]

votes, candidates = (list(t) for t in zip(*sorted(zip(votes, candidates))))


print(sorted(votes, reverse=True))
print(sorted(candidates, reverse=True))
输出:

[9, 7, 3, 1]
['Mitt', 'Hillary', 'Donald', 'Barack']
[('Mitt', 3), ('Hillary', 1), ('Donald', 9), ('Barack', 7)]
[9, 7, 3, 1]
['Donald', 'Barack', 'Mitt', 'Hillary']

输出:

[9, 7, 3, 1]
['Mitt', 'Hillary', 'Donald', 'Barack']
[('Mitt', 3), ('Hillary', 1), ('Donald', 9), ('Barack', 7)]
[9, 7, 3, 1]
['Donald', 'Barack', 'Mitt', 'Hillary']
编辑3:

candidates = ['Donald', 'Barack', 'Hillary', 'Mitt']
votes = [9, 7, 1, 3]

votes, candidates = (list(t) for t in zip(*sorted(zip(votes, candidates), reverse=True)))

print(votes)
print(candidates)
输出:

[9, 7, 3, 1]
['Mitt', 'Hillary', 'Donald', 'Barack']
[('Mitt', 3), ('Hillary', 1), ('Donald', 9), ('Barack', 7)]
[9, 7, 3, 1]
['Donald', 'Barack', 'Mitt', 'Hillary']

或者,用于反转的切片:

candidates = ['Donald', 'Barack', 'Hillary', 'Mitt']
votes = [9, 7, 1, 3]
votes, candidates = (list(t) for t in zip(*sorted(zip(votes, candidates))[::-1]))

这些不是嵌套的
列表,事实上甚至都不是排序的列表(zip(投票,候选人),reverse=True)
有没有办法让它输出两个列表,比如解压缩?当然。但是为什么呢?数据集似乎密切相关?不管怎样,这里是,
投票,name=zip(*排序(zip(投票,候选人),key=lambda x:x[0],reverse=True))
这输出了两个列表,非常完美。但是,这些列表并不同步。唐纳德应该是第一,然后是巴拉克etc@DaneBaird如果按降序排列,为什么唐纳德应该排在第一位?@DaneBaird check Edit 3。很抱歉,我意识到我没有指定要先排序的列表!编辑3是完美的