在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是完美的