微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Python中对嵌套列表进行排序和分组

如何解决在Python中对嵌套列表进行排序和分组

对于第一个问题,您应该做的第一件事是使用运算符模块中的itemgetter按第二个字段对列表进行排序:

x = [
 ['4', '21', '1', '14', '2008-10-24 15:42:58'], 
 ['3', '22', '4', '2somename', '2008-10-24 15:22:03'], 
 ['5', '21', '3', '19', '2008-10-24 15:45:45'], 
 ['6', '21', '1', '1somename', '2008-10-24 15:45:49'], 
 ['7', '22', '3', '2somename', '2008-10-24 15:45:51']
]

from operator import itemgetter

x.sort(key=itemgetter(1))

然后,您可以使用itertools的groupby函数

from itertools import groupby
y = groupby(x, itemgetter(1))

现在y是一个包含(元素,项目迭代器)元组的迭代器。解释这些元组显示代码更令人困惑:

for elt, items in groupby(x, itemgetter(1)):
    print(elt, items)
    for i in items:
        print(i)

哪些打印:

21 <itertools._grouper object at 0x511a0>
['4', '21', '1', '14', '2008-10-24 15:42:58']
['5', '21', '3', '19', '2008-10-24 15:45:45']
['6', '21', '1', '1somename', '2008-10-24 15:45:49']
22 <itertools._grouper object at 0x51170>
['3', '22', '4', '2somename', '2008-10-24 15:22:03']
['7', '22', '3', '2somename', '2008-10-24 15:45:51']

对于第二部分,您应该使用已经在这里提到的列表推导:

from pprint import pprint as pp
pp([y for y in x if y[3] == '2somename'])

哪些打印:

[['3', '22', '4', '2somename', '2008-10-24 15:22:03'],
 ['7', '22', '3', '2somename', '2008-10-24 15:45:51']]

解决方法

我具有以下数据结构(列表列表)

[
 ['4','21','1','14','2008-10-24 15:42:58'],['3','22','4','2somename','2008-10-24 15:22:03'],['5','3','19','2008-10-24 15:45:45'],['6','1somename','2008-10-24 15:45:49'],['7','2008-10-24 15:45:51']
]

我希望能够

  1. 使用函数对列表重新排序,以便我可以按列表中的每个项目分组。例如,我希望能够按第二列分组(以便所有21列在一起)

  2. 使用函数仅显示每个内部列表中的某些值。例如,我想减少此列表,使其仅包含“ 2somename”的第四个字段值

所以列表看起来像这样

[
     ['3','2008-10-24 15:45:51']
]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。