用条件组合python中的列表

2024-10-01 17:28:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个清单如下:

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

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

我想结合一个条件,将采取每个用户的最大数列表,所以最后我会得到这个列表

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

有什么建议吗?你知道吗

TNX公司


Tags: 用户列表公司root条件num建议list
3条回答

您需要的排序需要数字而不是字符串。将数字作为字符串排序时,将返回不同的结果。你知道吗

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']]

如果顺序很重要,可以使用OrderedDict,否则就可以使用普通的dict。但基本上,使用一个过程来实现从user到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]]
>>>

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

在上述^{}中,返回(user, num)元组的iterable:

>>> pairs = list(zip(user_list, num_list))
>>> pairs
[('oshamir', '400'), ('oshamir', '700'), ('oshamir', '600'), ('ctmuser', '300'), ('ctmuser', '500'), ('root', '1000'), ('root', '400'), ('root', '2000')]

然后使用^{}根据每个元组中的第一个项对项进行分组:

>>> 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')]]

最后使用带有key函数的^{}来挑选具有最大值的对。请注意,num_list上的项是字符串,因此需要将它们转换为数字,以便我们选择'2000'而不是'400'

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

相关问题 更多 >

    热门问题