python_字典和集合

1.1.字典

1.1.1.字典定义

字典是包含若干“键:值”元素的无序可变序列,字典中的每个元素包含“键”和“值”两部分,定义字典时,每个元素的键和值用冒号分隔,元素之间用逗号分隔,所有的元素放在一对大括号“{}”中。字典中的键可以为任意不可变数据,比如整数、实数、字符串、元组等等。

1.1.2.字典的创建

创建 使用“=”将一个字典赋值给另一个变量
例如:

a_dict = {'server':'db.neuedu.com','database':'mysql'}
print(a_dict)

输出:

{'server': 'db.neuedu.com', 'database': 'mysql'}
x = {}  #空字典
print(x)

输出:

{}

利用dict()利用已有数据创建字典
例如:

keys = ['a','b','c','d']
values = [1,2,3,4]
dictionary = dict(zip(keys,values))
print(dictionary)

输出:

{'a': 1, 'b': 2, 'c': 3, 'd': 4}

使用dict()根据给定的键、值创建字典
例如:

d = dict(name = 'Dong',age = 37)
print(d)

输出:

{'name': 'Dong', 'age': 37}

以给定内容为键,创建值为空的字典
例如:

adict = dict.fromkeys(['name','age','sex'])
print(adict)

输出:

{'name': None, 'age': None, 'sex': None}

1.1.3.字典元素的读取

  • 以键作为下标可以读取字典元素,若键不错在则抛出异常
    例如:
adict = {'name':'Dong','sex':'male','age':37}
print(adict['name'])

输出:

Dong
  • 使用字典对象的get方法获取指定键对应的值,并且可以在键不存在的时候返回指定值
    例如:
adict = {'name':'Dong', 'sex':'male', 'age':37}
print(adict.get('address'))
print(adict.get('address','SDIBT'))
adict['score'] = adict.get('score',[])
adict['score'].append(98)
adict['score'].append(97)
print(adict)

输出:

None
SDIBT
{'name': 'Dong', 'sex': 'male', 'age': 37, 'score': [98, 97]}
  • 使用字典对象的item()方法可以返回字典的键、值对列表
    例如:
adict = {'name':'Dong', 'sex':'male', 'age':37}
for item in adict.items():  #输出字典中所有元素
    print(item)
for key in adict:     #不加特殊说明,默认输出键
    print(key)

输出:

('name', 'Dong')
('sex', 'male')
('age', 37)
name
sex
age
  • 使用字典对象的keys()方法可以返回字典的键列表
    例如:
adict = {'name':'Dong', 'sex':'male', 'age':37}
print(adict.keys()) #返回所有键

输出:

dict_keys(['name', 'sex', 'age'])
  • 使用字典对象的values()方法可以返回字典的值列表
    例如:
adict = {'name':'Dong', 'sex':'male', 'age':37}
print(adict.values())     #返回所有值

输出:

dict_values(['Dong', 'male', 37])
  • 使用字典对象的setdefault()方法返回指定“键”对应的“值”,如果字典中不存在该“键”,就添加一个新元素设置该“键”对应的“值”。
    例如:
adict = {'name':'Wang','sex':'male'}
adict.setdefault('age','28')   #添加新元素
print(adict)

输出:

{'name': 'Wang', 'sex': 'male', 'age': '28'}

1.1.4.字典元素的添加

  • 当以指定键为下标为字典赋值时,若键存在,则可以修改该键的值;若不存在,则表示添加一个键、值对。
    例如:
adict = {'name':'Wang','sex':'male'}
adict.setdefault('age','28')
adict['age'] = 38
print(adict)
adict['address'] = 'SDIBT'
print(adict)

输出:

{'name': 'Wang', 'sex': 'male', 'age': 38}
{'name': 'Wang', 'sex': 'male', 'age': 38, 'address': 'SDIBT'}
  • 使用字典对象的update方法将另一个字典的键、值对添加到当前字典对象
    例如:
adict = {'name':'Wang','sex':'male'}
print(adict.items())
adict.update({'a':'a','b':'b'})
print(adict)

输出:

dict_items([('name', 'Wang'), ('sex', 'male')])
{'name': 'Wang', 'sex': 'male', 'a': 'a', 'b': 'b'}

1.1.5.字典删除

  • 使用del删除整个字典,或者字典中的指定元素
  • 使用pop()和popitem()方法弹出并删除指定元素
  • 使用clear()方法清空字典中所有元素

字典clear()方法

clear()方法是用来清除字典中的所有数据,因为是原地操作,所以返回None(也可以理解为没有返回值)

x = {}
x['name'] = 'lili'
x['age'] = 20
print(x)
x.clear()
print(x)

输出:

{'name': 'lili', 'age': 20}
{}

字典pop()方法

移除字典数据pop()方法的作用是:删除指定给定键所对应的值,返回这个值并从字典中把它移除。注意字典pop()方法与列表pop()方法作用完全不同。

x = {'a':1,'b':2}
print(x.pop('a'))
print(x)

输出:

1
{'b': 2}

字典popitem()方法

字典popitem()方法作用是:随机返回并删除字典中的一对键和值(项)。为什么是随机删除呢?因为字典是无序的,没有所谓的“最后一项”或是其它顺序。在工作时如果遇到需要逐一删除项的工作,用popitem()方法效率很高。

x = {'url':'www.neuedu.com','title':'python web site'}
print(x.popitem())
print(x)

输出:

('title', 'python web site')
{'url': 'www.neuedu.com'}

1.1.6.判断一个key是否在字典中

使用in方法

#生成一个字典
d = {'name':'tom','age':10,'Tel':110}
#打印返回值,其中d.keys()是列出字典所有的key
print('name' in d.keys())
print('name' in d)
#两个的结果都是返回True

除了使用in还可以使用not in,判定这个key不存在。

1.1.7.遍历字典

(1)遍历key值

a = {'a':'1','b':'2','c':'3'}
for key in a.keys():
    print(key+':'+a[key])

输出:

a:1
b:2
c:3

在使用上,for key in a和for key in a.keys():完全等价
(2)遍历value值

for value in a.values():
    print(value)

输出:

1
2
3

(3)遍历字典项

for kv in a.items():
    print(kv)

输出:

('a', '1')
('b', '2')
('c', '3')

(4)遍历字典键值

for key,value in a.items():
    print(key+':'+value)

输出:

a:1
b:2
c:3

在使用上for key,value in a.items()与for(key,value) in a.items()完全等价

1.1.8.有序字典

python内置字典是无序的,如果需要一个可以记住元素插入顺序的字典,可以使用collections.OrderedDict
例如:

x = dict() #无序字典
x['a'] = 3
x['b'] = 5
x['c'] = 8
print(x)
import collections
x = collections.OrderedDict()  #有序字典
x['a'] = 3
x['b'] = 5
x['c'] = 8
print(x)

输出:

{'a': 3, 'b': 5, 'c': 8}
OrderedDict([('a', 3), ('b', 5), ('c', 8)])

1.2.集合

1.2.1.集合定义

集合是无序可变序列,使用一对大括号界定,元素不可重复,同一个集合中每个元素都是唯一的。集合中只能包含数字、字符串、元组等不可变类型的数据,而不能包含列表、字典、集合等可变类型的数据。

1.2.2.集合的创建

直接将集合赋值给变量
例如:

a = {3,5}
a.add(7)
print(a)

输出:

{3, 5, 7}  #向集合中添加元素

使用set将其他类型数据转换为集合
例如:

a_set = set(range(8,14))
print(a_set)
b_set = set([0,1,2,3,0,1,2,3,7,8])  #自动去除重复
print(b_set)
c_set = set()  #空集合
print(c_set)

输出:

{8, 9, 10, 11, 12, 13}
{0, 1, 2, 3, 7, 8}
set()

1.2.3.集合的删除

使用del删除整个集合

1.2.4.集合元素的增加与删除

增加元素 使用add()方法为集合添加新元素,如果该元素已存在于该集合中则忽略该操作。
例如:

s = {1,2,3}
s.add(3)
print(s)

输出:

{1,2,3}

使用update()方法合并另外一个集合中的元素到当前集合中
例如:

s = {1,2,3}
s.update({3,4,5})
print(s)

输出:

{1,2,3,4,5}

删除元素 当不再使用某个集合时,可以使用del命令删除整个集合。集合对象的pop()方法弹出并删除其中一个元素,remove()方法直接删除指定元素,clear()方法清空集合。
例如:

a = {1,4,2,3}
print(a.pop())
print(a.pop())
print(a)
a.add(2)
print(a)
a.remove(3)
print(a)

输出:

1
2
{3, 4}
{2, 3, 4}
{2, 4}

1.2.5.集合操作

python集合支持交集、并集、差集等运算
例如:

a_set = set([8,9,10,11,12,13])
b_set = set([0,1,2,3,7,8])
print(a_set|b_set)  #并集
print(a_set.union(b_set))  #并集
print(a_set & b_set)  #交集
print(a_set.intersection(b_set))  #交集
print(a_set.difference(b_set))  #差集
print(a_set - b_set)  #差集

输出:

{0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13}
{0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13}
{8}
{8}
{9, 10, 11, 12, 13}
{9, 10, 11, 12, 13}
x = {1,2,3}
y = {1,2,5}
z = {1,2,3,4}
print(x.issubset(y))  #测试是否为子集
print(x < y)   #比较集合大小/包含关系
print(x.issubset(z))
print(x < z)  #真子集

输出:

False
False
True
True

1.3.综合练习

1.3.1.统计单词出现次数

word = "I'm a boy,I'm a girl.When it is true,it is ture.that are cats,the red is red"
word = word.replace(',','').replace('.','')
word = word.split()
print(word)
print('第1种方法')
setword = set(word)
for i in setword:
    count = word.count(1)
    print(i,'出现次数:',count)
print('第2种方法')
dict = {}
for key in word:
    dict[key] = dict.get(key,0) + 1
print(dict)
print('第3种方法')
from collections import Counter
result = Counter(dict)
print(result)
print(result.most_common(3))

1.3.2.奥运会足球分组

已知有十六支男子足球队参加2008北京奥运会。写一个程序,把这16支球队随机分为4个组。采用List集合和随机数


# // map,保存最终分组结果
# // key保存的是第几组,value是该组对应的国家集合
import random
groupNum2Countrys = {}

strCountrys = "科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷兰,尼日利亚,日本,美国,中国,新西兰,巴西,比利时,韩国,喀麦隆,洪都拉斯,意大利";
countryList = strCountrys.split(",")

for i in range(4):
    lstGroup = []
    # // 分第1组
    # // 随机从集合中选出一个国家,放到第1组里;然后将这个选出的国家,从原来集合中干掉(删除)
    # // 重复以上步骤4次
    for j in range(4):
        selectIndex = random.randint(0,len(countryList)-1)
        lstGroup.append(countryList[selectIndex])
        countryList.remove(countryList[selectIndex])

    groupNum2Countrys[i+1] = lstGroup

for key,value in groupNum2Countrys.items():
    print('第' + str(key) + '组')
    print(value)

输出:

第1组
['荷兰', '比利时', '塞尔维亚', '阿根廷']
第2组
['意大利', '韩国', '洪都拉斯', '巴西']
第3组
['澳大利亚', '中国', '科特迪瓦', '尼日利亚']
第4组
['喀麦隆', '日本', '新西兰', '美国']
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容