可以使用zip
配对列表起来,然后由用户,并且从每个组组对挑选一个与最大值:
>>> from itertools import groupby
>>> user_list = ['oshamir','oshamir','oshamir','ctmuser','ctmuser','root','root','root']
>>> num_list = ['400','700','600','300','500','1000','400','2000']
>>> [max(g, key=lambda x: int(x[1])) for _, g in groupby(zip(user_list, num_list), lambda x: x[0])]
[('oshamir', '700'), ('ctmuser', '500'), ('root', '2000')]
在上述zip
返回可迭代的(user, num)
元组:
>>> pairs = list(zip(user_list, num_list))
>>> pairs
[('oshamir', '400'), ('oshamir', '700'), ('oshamir', '600'), ('ctmuser', '300'), ('ctmuser', '500'), ('root', '1000'), ('root', '400'), ('root', '2000')]
然后groupby
用于组基于在每个元组中的第一项的项目:
>>> groups = [list(g) for _, g in groupby(pairs, lambda x: x[0])]
>>> groups
[[('oshamir', '400'), ('oshamir', '700'), ('oshamir', '600')], [('ctmuser', '300'), ('ctmuser', '500')], [('root', '1000'), ('root', '400'), ('root', '2000')]]
最后max
与key
功能用于挑一对与最大值。请注意,num_list
的项目都是字符串所以他们需要被转换成数字,让我们挑'2000'
而不是'400'
:
>>> [max(g, key=lambda x: int(x[1])) for g in groups]
[('oshamir', '700'), ('ctmuser', '500'), ('root', '2000')]
能否请你澄清你的问题。 “每个用户的最大数量”是什么意思? –
用户列表是否总是按用户名排序? 'user_list'的顺序是否需要保存在结果中? – mhawke
首先将字符串更改为'num_list'中的数字。第二个结合数据:'combined = list(zip(user_list,num_list))'。然后继续工作。 (提示:'data = dict(sorted(combined))'可能是下一步)。 – Matthias