2017-02-15 116 views
-3

我有两个列表如下图所示:结合列表蟒蛇与条件

user_list = ['oshamir','oshamir','oshamir','ctmuser','ctmuser','root','root','root'] 

    num_list = ['400','700','600','300','500','1000','400','2000'] 

我想一个清单,将采取最大NUM为每个用户所以最后我会得到这个名单的条件相结合

[['oshamir','700'],['ctmuser','500'],['root','2000']] 

有什么建议吗?

TNX

+1

能否请你澄清你的问题。 “每个用户的最大数量”是什么意思? –

+0

用户列表是否总是按用户名排序? 'user_list'的顺序是否需要保存在结果中? – mhawke

+0

首先将字符串更改为'num_list'中的数字。第二个结合数据:'combined = list(zip(user_list,num_list))'。然后继续工作。 (提示:'data = dict(sorted(combined))'可能是下一步)。 – Matthias

回答

6

可以使用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')]] 

最后maxkey功能用于挑一对与最大值。请注意,num_list的项目都是字符串所以他们需要被转换成数字,让我们挑'2000'而不是'400'

>>> [max(g, key=lambda x: int(x[1])) for g in groups] 
[('oshamir', '700'), ('ctmuser', '500'), ('root', '2000')] 
+0

作品真棒! – shamirs888

0

如果顺序的问题,你可以使用一个OrderedDict,否则,正常的dict会做。但基本上,使用一次传递将用户映射到num,每次保持较大的值。然后,再次通过获取你想要的数据结构。

>>> d = OrderedDict() 
>>> for user, num in zip(user_list, num_list): 
...  d[user] = max(d.get(user, float('-inf')), int(num)) 
... 
>>> [[k,v] for k,v in d.items()] 
[['oshamir', 700], ['ctmuser', 500], ['root', 2000]] 
>>> 
0

您需要的排序需要的数字不是字符串。将数字排序为字符串时返回不同的结果。

res = list(zip(user_list, map(int, num_list))) # [('oshamir', 400), ('oshamir', 700), ('oshamir', 600), ('ctmuser', 300), ('ctmuser', 500), ('root', 1000), ('root', 400), ('root', 2000)] 
res.sort(key=lambda x: (x[0], x[1]))   # [('ctmuser', 300), ('ctmuser', 500), ('oshamir', 400), ('oshamir', 600), ('oshamir', 700), ('root', 400), ('root', 1000), ('root', 2000)] 
final = {k:str(v) for k,v in res}    # {'ctmuser': '500', 'root': '2000', 'oshamir': '700'} 

所以我会转换为数字,排序并获得最大值,最后切换回字符串。

,如果你明确要求列出的清单作为输出,你可以在上面添加一个列表理解像这样:

final = [[a, b] for a, b in final.items()]  # [['ctmuser', '500'], ['root', '2000'], ['oshamir', '700']]