python 字典处理_python之高效处理字典、序列的一些语法

本文介绍了如何使用Python的deque进行序列相关操作,如保留最后N个元素;高效查找最大、最小元素的方法heapq;filter函数的应用;字典的有序排序和分组技巧,包括使用OrderDict、sorted和groupby。
摘要由CSDN通过智能技术生成

知识点记录:

1.序列相关

使用deque 进行保留最后N个元素

a = deque(maxlen=3)

a.append(2)

a.appendleft(1)

a.append(3)

a.append(4)

# a.pop() 也可以 a.leftpop()

# 输出

[2, 3, 4]

# ps: 在队列两端插入或删除元素时间复杂度都是 O(1) ,区别于列表,在列表的开头插入或删除元素的时间复杂度为 O(N)

查找最大或者最小的几个元素

import heapq

nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]

print(heapq.nlargest(3, nums)) # Prints [42, 37, 23]

print(heapq.nsmallest(3, nums)) # Prints [-4, 1, 2]

使用filter()过滤序列元素

values = ['1', '2', '-3', '-', '4', 'N/A', '5']

def is_int(val):

try:

x = int(val)

return True

except ValueError:

return False

ivals = list(filter(is_int, values))

print(ivals)

# Outputs ['1', '2', '-3', '4', '5']

用 iterable 中函数 function 返回真的那些元素,构建一个新的迭代器。iterable 可以是一个序列,一个支持迭代的容器,或一个迭代器。如果 function 是 None ,则会假设它是一个身份函数,即 iterable 中所有返回假的元素会被移除。

请注意, filter(function, iterable) 相当于一个生成器表达式,当 function 不是 None 的时候为 (item for item in iterable if function(item));function 是 None 的时候为 (item for item in iterable if item) 。

2.字典相关

使用 from collections import OrderDict 会默认按照插入的顺序进行排序,可以在数据库查出来数据进行拼装时候不需要转换为列表排序

使用 sorted函数进行排序 sorted(zip(prices.values(), prices.keys())) 可以先将字典的key和value进行反转映射,然后就sorted排序,默认会按照元祖中的第一个值进行排序

按照指定的元素进行排序

from oprator import itemgetter

# 这个方法可以代替匿名函数,并且效率更高

rows = [

{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},

{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},

{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},

{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}

]

rows_by_uid = sorted(rows, key=itemgetter('uid'))

等同于

rows_by_uid = sorted(rows, key=lambda r: r['uid'])

# 也同时支持多 key进行排序

rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))

按照字典中的对象属性去进行排序

class Age:

def __init__(self, number):

self.number = number

def __repr__(self):

return 'Age({})'.format(self.number)

def sort_notcompare():

ages = [Age(23), Age(3), Age(99)]

print(ages)

# 匿名函数方式

print(sorted(ages, key=lambda a: a.number))

# attrgetter 方式 效率更高

from operator import attrgetter

sorted(ages, key=attrgetter('number'))

对列表中的字典序列进行分组

from operator import itemgetter

from itertools import groupby # 使用groupby 进行分组

rows = [

{'address': '5412 N CLARK', 'date': '07/01/2012'},

{'address': '5148 N CLARK', 'date': '07/04/2012'},

{'address': '5800 E 58TH', 'date': '07/02/2012'},

{'address': '2122 N CLARK', 'date': '07/03/2012'},

{'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},

{'address': '1060 W ADDISON', 'date': '07/02/2012'},

{'address': '4801 N BROADWAY', 'date': '07/01/2012'},

{'address': '1039 W GRANVILLE', 'date': '07/04/2012'},

]

rows.sort(key=itemgetter('date'))

# Iterate in groups

for date, items in groupby(rows, key=itemgetter('date')):

print(date)

for i in items:

print (i)

# 输出结果:

07/01/2012

{'date': '07/01/2012', 'address': '5412 N CLARK'}

{'date': '07/01/2012', 'address': '4801 N BROADWAY'}

07/02/2012

{'date': '07/02/2012', 'address': '5800 E 58TH'}

{'date': '07/02/2012', 'address': '5645 N RAVENSWOOD'}

{'date': '07/02/2012', 'address': '1060 W ADDISON'}

07/03/2012

{'date': '07/03/2012', 'address': '2122 N CLARK'}

07/04/2012

{'date': '07/04/2012', 'address': '5148 N CLARK'}

{'date': '07/04/2012', 'address': '1039 W GRANVILLE'}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值