数据结构相关模块(字典)

1.多值映射

一般的字典都是一个键对应一个值。为了想要实现多值映射就需要一个容器,列表或者集合,比如:

d = {‘a‘ : [1, 2, 3],‘b‘ : [4, 5]}e = {‘a‘ : {1, 2, 3},‘b‘ : {4, 5}}

如果要实现上面的,就必须先对键值进行初始化为列表或者集合:

d={}
d.setdefault(‘a‘, []).append(1)

如果我们用collections模块下的defaultdict来实现就简单好多

d = defaultdict(list)for key, value in pairs:
    d[key].append(value)

如果自己实现呢?就是这样的:

d = {}for key, value in pairs:if key not in d:
    d[key] = []
    d[key].append(value)

2.字典排序

如果需要生成一个有顺序的字典,可以使用collections模块中的OrderedDict,会按照输入的顺序排序:

from collections import OrderedDictdef ordered_dict():
    d = OrderedDict()
    d[‘foo‘] = 1
    d[‘bar‘] = 2
    d[‘spam‘] = 3
    d[‘grok‘] = 4
    # Outputs "foo 1", "bar 2", "spam 3", "grok 4"
    for key in d:print(key, d[key])

当然,一个OrseredDict的大小是一个普通字典的两倍,因为它内部维护着另外一条链表

3.字典计算

当求最大值,最小值或者排序时,通常用到zip()函数将键和值翻转,然后进行比较或者排序

prices = {‘ACME‘: 45.23,‘AAPL‘: 612.78,‘IBM‘: 205.55,‘HPQ‘: 37.20,‘FB‘: 10.75}
min(zip(prices.values(),prices.keys()))
sorted(zip(prices.values(),prices.keys()))

注:zip函数创建的是一个只能访问一次的迭代器

prices_and_names = zip(prices.values(), prices.keys())print(min(prices_and_names)) # OKprint(max(prices_and_names)) # ValueError: max() arg is an empty sequence

也可以在 min() 和 max() 函数中提供 key 函数参数来获取最小值或最大值对应的键的信息

min(prices, key=lambda k: prices[k]) # Returns ‘FB‘

4.找两个字典的相同点

a = {‘x‘ : 1,‘y‘ : 2,‘z‘ : 3}b = {‘w‘ : 10,‘x‘ : 11,‘y‘ : 2}
a.keys() & b.keys() # { ‘x‘, ‘y‘ }
a.keys() - b.keys() # { ‘z‘ }
a.items() & b.items() # { (‘y‘, 2) }

字典过滤:

c = {key:a[key] for key in a.keys() - {‘z‘, ‘w‘}}# c is {‘x‘: 1, ‘y‘: 2}

字典的items()keys()都支持集合操作交,并,差运算~

5.根据某个或某几个字典字段来排序这个列表

通过使用 operator 模块的 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}]from operator import itemgetter
rows_by_fname = sorted(rows, key=itemgetter(‘fname‘))
rows_by_lfname = sorted(rows, key=itemgetter(‘lname‘,‘fname‘))

当然也可以用匿名函数代替itemgetter(),但是,使用itemgetter()方式会运行的稍微快点 ``` rowsbyfname = sorted(rows, key=lambda r: r[‘fname‘]) rowsbylfname = sorted(rows, key=lambda r: (r[‘lname‘],r[‘fname‘]))

以上同样适用于min() max()### 6排序不支持原生比较的对象 operator.attrgetter()

class User: def init(self, userid): self.userid = userid def repr(self): return ‘User({})‘.format(self.userid) def sortnotcompare(): users = [User(23), User(3), User(99)] print(users) print(sorted(users, key=lambda u: u.userid)) ```

另外一种方式是使用 operator.attrgetter() 来代替lambda函数:

>>> from operator import attrgetter>>> sorted(users, key=attrgetter(‘user_id‘))
[User(3), User(23), User(99)]

7.通过某字段分组

groupby() 函数扫描整个序列并且查找连续相同值(或者根据指定key函数返回值相同)的元素序列。 首先需要按照指定的字段(这里就是 date )排序, 然后调用 itertools.groupby() 函数:

from operator import itemgetterfrom itertools import groupby# Sort by the desired field firstrows.sort(key=itemgetter(‘date‘))# Iterate in groupsfor date, items in groupby(rows, key=itemgetter(‘date‘)):
    print(date)    for i in items:
        print(‘ ‘, i)

8.合并多个字典

一个非常简单的解决方案就是使用 collections 模块中的 ChainMap 类 一个 ChainMap 接受多个字典并将它们在逻辑上变为一个字典。 然后,这些字典并不是真的合并在一起了, ChainMap 类只是在内部创建了一个容纳这些字典的列表 并重新定义了一些常见的字典操作来遍历这个列表。大部分字典操作都是可以正常使用的 作为 ChainMap 的替代,你可能会考虑使用 update() 方法将两个字典合并。但是它需要你创建一个完全不同的字典对象(或者是破坏现有字典结构)。 同时,如果原字典做了更新,这种改变不会反应到新的合并字典中去。

时间: 2024-10-16 07:22:09

数据结构相关模块(字典)的相关文章

数据结构相关模块(堆)

如果学过数据结构就知道 堆排序,python提供了一个堆队列的模块heapq能很容易实现堆排序 heapd 如果要获取一个列表中N个最大最小的元素,heapd提供了两个函数:nlargest()和nsmallest import heapqnums = [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))

数据结构相关模块(列表)

所有内容参照自 python cookbook 1.解压序列赋值给多个变量 一般来讲我们赋值变量是这样: a = 1 python可以这样: a,b = 1,2 或者这样: e=[1,2,3,4] a,b,c,d=e 当然 你想解压几层就解压几层,比如这样: data = [ 'ACME', 50, 91.1, (2012, 12, 21) ] name, shares, price, (year, mon, day) = data 如果你只是想要其中的几个变量,这....python没有给出特

ansible 软件相关模块,剧本

软件相关模块 yum rpm和yum的区别 rpm:redhat package manager yum 可以解决依赖关系 yum 源配置 使用yum下载时需要先下载epel [epel] name=Extra Packages for Enterprise Linux 7 - $basearch #名字 baseurl=http://mirrors.aliyun.com/epel/7/$basearch #rpm源的地址,可以写http,https,ftp,Samba,file: failov

python json模块 字典 输出中文

json.dumps({'text':"中文"},ensure_ascii=False,indent=2) python json模块 字典得到字符串,输出中文

hdu-(1298手机相关 dfs+字典树)

题目大意: 在以前,手机输入法很麻烦,因为只有9个键,而字母有26个,所以一个键上同时包含这几个字母,这样的话,为了打出一个字母可能要按几次.比如键5有"JKL", 如果要输入K,那么就要连按两次. 这样的输入法很麻烦.所以一家公司发明了T9技术输入法.这种输入法内置这很多英语单词,它可以根据英语出现的频率,是否存在等信息,每个字母只要按一次,就可以有想要的预选单词. 例如,假设输入法只内置了一个单词"hell", 那么只需要按4355便可以出来. 注意,如果有一个

python数据结构-序列之字典

字典是python中唯一内建的映射类型.(映射是通过名字引用值的数据结构). 字典中的值没有特殊顺序,但是都存储在一个特定的键(key)中.键可以是数字.字符串.元组. 一.创建字典: 1.创建字典: 如: phonebook={'zhangsan':'233333','lisi':'322233','wangwu':'4323334'} 字典由多个键及其对应的值构成的对组(也把键/值对 称为项).在phonebook示例中,名字是键,电话号码是值.键和值之间用冒号(:)隔开,项之间用逗号(,)

2、NS3-目录结构和相关模块

Waf是基于Python开发的编译工具,ns-3系统本身和将要写的仿真代码都由waf负责编译运行. Scratch目录一般存放用户脚本文件,也可以把要运行的例子拷贝到该目录下. Example是ns-3提供的关于如何使用ns-3的例子,包含许多模块的使用. Doc目录是帮助文档,可以使用./waf --doxygen编译本地Doxygen文档. Build目录是ns-3编译目录,包含编译文件时使用的共享库和头文件(build/ns3). Src是ns-3源码目录. 模块里面的wscript文件结

saltstack模块之pkg相关模块

1.pkg.available_version模块 pkg.available_version: 返回所查询软件包可供安装或更新的最新版本.如果指定多个软件包,则以字典的形式输出返回结果. [[email protected] ~]# salt '*' pkg.available_version httpd salt-minion02.contoso.com:     2.2.15-59.el6.centos salt-minion01.contoso.com:     2.2.15-59.el

『Pickle』数据结构持久化模块_常用方法记录

可以把数据结构保存进文件并直接读出, 不论读取或者是保存,我们都需要借助open()函数,并且是二进制方式('wb','rb') json模块可以把字典结构改写为string然后保存,并可以反向读取字典,但是即使是字典数据结构,两个包也是有差别的 json字典value不支持其他对象只支持python原有的结构,但是json由于是转换为string,所以保存的文件是可以使用文本查看器去读取的 pickle包则支持各种python的对象,但它写入的是二进制文件,并有自己独特的编码方式,所以是不可以