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

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

[

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

]

我希望能够

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

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

所以列表看起来像这样

[

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

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

]

m3clov3n asked 2020-08-10T09:14:34Z

8个解决方案

62 votes

对于第一个问题,您应该做的第一件事是使用运算符模块中的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

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

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

llimllib answered 2020-08-10T09:15:01Z

12 votes

如果您将其分配给变量“ a” ...

πυθων2.χ:

#1:

a.sort(lambda x,y: cmp(x[1], y[1]))

#2:

filter(lambda x: x[3]=="2somename", a)

的Python 3:

#1:

a.sort(key=lambda x: x[1])

Jimmy2Times answered 2020-08-10T09:15:43Z

3 votes

如果我正确理解您的问题,则以下代码可以完成此工作:

l = [

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

]

def compareField(field):

def c(l1,l2):

return cmp(l1[field], l2[field])

return c

# Use compareField(1) as the ordering criterion, i.e. sort only with

# respect to the 2nd field

l.sort(compareField(1))

for row in l: print row

print

# Select only those sublists for which 4th field=='2somename'

l2somename = [row for row in l if row[3]=='2somename']

for row in l2somename: print row

输出:

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

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

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

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

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

Federico A. Ramponi answered 2020-08-10T09:16:07Z

2 votes

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

列表具有内置的排序方法,您可以提供提取排序键的函数。

>>> import pprint

>>> l.sort(key = lambda ll: ll[1])

>>> pprint.pprint(l)

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

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

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

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

这看起来像是列表理解的工作

>>> [ll[3] for ll in l]

['14', '2somename', '19', '1somename', '2somename']

Aaron Maenpaa answered 2020-08-10T09:16:42Z

2 votes

如果您要进行很多排序和过滤,则可能需要一些帮助器功能。

m = [

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

]

# Sort and filter helpers.

sort_on = lambda pos: lambda x: x[pos]

filter_on = lambda pos,val: lambda l: l[pos] == val

# Sort by second column

m = sorted(m, key=sort_on(1))

# Filter on 4th column, where value = '2somename'

m = filter(filter_on(3,'2somename'),m)

Triptych answered 2020-08-10T09:17:02Z

2 votes

对于第(2)部分,以x为您的数组,我认为您想要,

[y for y in x if y[3] == '2somename']

这将仅返回您的数据列表的列表,该列表的第四个值为'2somename'...尽管Kamil似乎为您提供了有关SQL的最佳建议...

answered 2020-08-10T09:17:28Z

1 votes

看起来很像您要使用列表作为数据库。

如今,Python在核心发行版中包含sqlite绑定。 如果不需要持久性,那么创建一个内存中的sqlite数据库真的很容易(请参阅如何创建sqllite3内存中的数据库?)。

然后,您可以使用SQL语句执行所有这些排序和筛选,而无需重新发明轮子。

Kamil Kisiel answered 2020-08-10T09:17:57Z

1 votes

您只是在结构上创建索引,对吧?

>>> from collections import defaultdict

>>> def indexOn( things, pos ):

... inx= defaultdict(list)

... for t in things:

... inx[t[pos]].append(t)

... return inx

...

>>> a=[

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

... ]

这是您的第一个请求,按职位1分组。

>>> import pprint

>>> pprint.pprint( dict(indexOn(a,1)) )

{'21': [['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': [['3', '22', '4', '2somename', '2008-10-24 15:22:03'],

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

这是您的第二个请求,按职位3分组。

>>> dict(indexOn(a,3))

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

>>> pprint.pprint(_)

{'14': [['4', '21', '1', '14', '2008-10-24 15:42:58']],

'19': [['5', '21', '3', '19', '2008-10-24 15:45:45']],

'1somename': [['6', '21', '1', '1somename', '2008-10-24 15:45:49']],

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

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

S.Lott answered 2020-08-10T09:18:26Z

python中对列表排序_在Python中对嵌套列表进行排序和分组相关推荐

  1. 无法从套接字中获取更多数据_数据科学中应引起更多关注的一个组成部分

    无法从套接字中获取更多数据 介绍 (Introduction) Data science, machine learning, artificial intelligence, those terms ...

  2. python 多维list 排序_人生苦短 | Python列表和元组归纳整理

    1. 列表 1.1. 列表是什么? 列表是由一系列按特定顺序排列的元素组成,所以是有序的集合.列表中的元素可以是不同类型的,列表中也可以嵌套列表.在Python中,用方括号[]来表示列表,并用逗号来分 ...

  3. python将对象放入列表根据某个属性排序_关于python:如何根据对象的属性对对象列表进行排序?...

    我有一个python对象列表,我想按对象本身的属性排序.列表如下: >>> ut [, , , , , , ...] 每个对象都有一个计数: >>> ut[1].c ...

  4. python的列表操作_在Python中列表的操作

    列表可以做什么? 假设你要创建一个基于<Go Fish>的游戏.如果你不知道<Go Fish>是什么,就去网上查一下.要实现这个游戏,你需要有一个办法,把"一摞纸牌& ...

  5. python用函数对列表删除_关于python:如何使用range()函数从列表中删除项目时迭代列表?...

    本问题已经有最佳答案,请猛点这里访问. 这是我在学习Python编程时遇到的最常见的问题.问题是,当我尝试使用"range()"函数迭代列表时,检查列表中的给定项是否满足给定条件, ...

  6. python中反向切片用法_使用Python中的切片[:0:-1]反转列表

    举个例子a = [1, 2, 3, 4, 4, 5, 6, 9] 如果你试着用正指数分割它newa = a[1:5] 这将导致newa = [2, 3, 4, 4] 这是因为,在上面这种情况下,切片是 ...

  7. python如果选择不在列表里_使用python中的in ,not in来检查元素是不是在列表中的方法...

    使用python中的in ,not in来检查元素是不是在列表中的方法 更新时间:2018年07月06日 15:01:34 作者:mengtianwxs 今天小编就为大家分享一篇使用python中的i ...

  8. python中list的运算_使用Python列表实现向量运算

    在Python中,列表支持与整数的乘法运算,但表示的是列表元素的重复,并生成新列表,如: >>> [1,2,3]*3 [1, 2, 3, 1, 2, 3, 1, 2, 3] Pyth ...

  9. python遍历是什么意思_在Python中遍历列表的方法有哪些

    Python中遍历列表有以下几种方法: 一.for循环遍历lists = ["m1", 1900, "m2", 2000] for item in lists: ...

最新文章

  1. 成都Uber优步司机奖励政策(1月20日)
  2. [USACO15JAN]踩踏Stampede
  3. 跟前腾讯总监学Java实战项目
  4. Open3D编译安装
  5. 机器学习实战_09_树回归_源代码错误修正
  6. azure git怎么使用_Azure(一)Azure Traffic Manager为我们的Web项目提供负载均衡
  7. 【干货】中国非结构化数据中台实践白皮书.pdf(附55页pdf下载链接)
  8. oracle 求班级平均分
  9. 17track逆向分析
  10. 粉笔计算机基础知识,计算机基础知识2-实作.ppt
  11. 项目管理的扫地僧---PRINCE2,学过PMP的必进!
  12. 英诚医院内部网络规划与设计
  13. 如何在Ubuntu18.4中设置ERPNEXT开源ERP生产环境开机运行
  14. Android电话本实现
  15. 有哪些需要不得不知的ASO的两种优化技巧
  16. 屏幕尺寸、分辨率、像素、PPT解释及其关系
  17. 数据结构与算法(三) 排序算法(代码示例)
  18. tensorflow函数学习
  19. ubuntu服务器ftp无法上传文件,ubuntu服务器上传文件ftp
  20. stitching.cpp鱼眼图像拼接融合 源码分析

热门文章

  1. 使用 matlab 心电数据捕获心率
  2. 小孩分油问题 (附python代码)
  3. 数据结构(二叉树相关、满、完全二叉树、霍夫曼树、排序方法及时间复杂度总结、)笔记-day11
  4. 《 V I M 教 程 》 —— 版本 1.5
  5. 磁开关入侵探测器——学习记录
  6. Qlik新手必看干货(一):什么是Qlik Sense?
  7. 看Win7系统怎样给U盘加密
  8. 离线安装 edge 浏览器
  9. STM32 Proteus仿真心率计步智能手表带闹钟DHT11温湿度显示DS1302-0020
  10. html快闪软件制作,快闪视频制作方法