数据结构和算法06-字典列表分组 / 过滤序列元素 / 字典中提取子集

如何将一个字典列表按字段分组

  • 使用 itertools.groupby()
    例:
dictlist = [
    {'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'}
]

#按'date'排序后分组
from operator import itemgetter
from itertools import groupby

dictlist.sort(key=itemgetter('date'))
for date, items in groupby(dictlist, key=itemgetter('date')):
    print(date)
    for i in items:
        print(' ', i)

打印结果:

07/01/2012
  {'address': '5412 N CLARK', 'date': '07/01/2012'}
  {'address': '4801 N BROADWAY', 'date': '07/01/2012'}
07/02/2012
  {'address': '5800 E 58TH', 'date': '07/02/2012'}
  {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'}
  {'address': '1060 W ADDISON', 'date': '07/02/2012'}
07/03/2012
  {'address': '2122 N CLARK', 'date': '07/03/2012'}
07/04/2012
  {'address': '5148 N CLARK', 'date': '07/04/2012'}
  {'address': '1039 W GRANVILLE', 'date': '07/04/2012'}

过滤序列元素

  • 使用列表推导,这是最简单的方法,比如:
mlist = [1,3,-5,12,-4,2,9,-1]
#过滤负数,只要大于0 的数
print([i for i in mlist if i > 0])    #[1, 3, 12, 2, 9]

#过滤正数,只要小于0 的数
print([i for i in mlist if i < 0])     #[-5, -4, -1]

如果数据比较大,考滤内存因素,可以运用生成器表达式遍历出来

  • filter()

有时候,过滤规则比较复杂,不能简单的在列表推导或者生成器表达式中表达出
来。比如,假设过滤的时候需要处理一些异常或者其他复杂情况。这时候你可以将过
滤代码放到一个函数中,然后使用内建的 filter() 函数。示例如下:

mlist = ['1', '2', '-3', '-', '4', 'N/A', '5']
#定义一个判断是否数字的方法
def is_int(val):
    try:
        x = int(val)
        return True
    except:
        return False

#使用内建函数fillter()过滤    
ret = list(filter(is_int,mlist))
print(ret)         # ['1', '2', '-3', '4', '5']

Tips: filter() 函数只是创建了一个迭代器,想得到一个列表的话,就得使用 list() 去转换。


  • itertools.compress()

这是以一个 iterable对象和一个相对应的布尔选择器序列作为输入参数。然后输出 iterable 对象中对应选择器为 True 的元素。
mlist = [
    '张三疯',
    '独孤求败',
    '风清扬',
    '达摩祖师',
    '扫地神僧',
    '令狐冲',
    '大理段思平'
]
#定义一个对应的列表
numblist = [1,15,3,4,5,0,13]

from itertools import compress

sorted_list = [n < 10 for n in numblist]
print(sorted_list)   #[True, False, True, True, True, True, False]

#对应着列表过滤
ylist = list(compress(mlist,sorted_list))
print(ylist)        #['张三疯', '风清扬', '达摩祖师', '扫地神僧', '令狐冲']

从字典中提取子集

  • 字典推导
prices = {     
    'ACME': 45.23,     
    'AAPL': 612.78,     
    'IBM': 205.55,     
    'HPQ': 37.20,     
    'FB': 10.75 
} 
p1 = {key: value for key, value in prices.items() if value > 200}
print(p1)    #{'AAPL': 612.78, 'IBM': 205.55}

tech_names = {
    'AAPL',
    'IBM',
    'HPQ',
    'MSFT' 
} 
p2 = {key: value for key, value in prices.items() if key in tech_names}
print(p2)     #{'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.2}


  • 使用 dict ()

创建一个元组序列然后把它传给 dict() 函数也能实现,但速度慢一点点

p1 = dict((key, value) for key, value in prices.items() if value > 200)
print(p1)     #{'AAPL': 612.78, 'IBM': 205.55}

猜你喜欢

转载自blog.csdn.net/xiangchi7/article/details/82353615