python字典与集合

字典

1.什么是字典

1)

字典是容器型数据类型(序列),将{}作为容器的标志,里面的元素用逗号隔开
特点:可变(支持增删改),无序(不支持下标操作)

2)字典中的元素

  • 字典中的元素就是键值对,以‘键:值’的形式成对出现 - {键1:值1,键2:值2,...}
    key - value

  • 字典存储数据主要是为了存值,键知识为了区分不同的值而存在的

  • 键值对中的键 - 不可变(所以列表不行)、唯一的(同一个字典中必须只有一个)

  • 键值对中的值 - 没有要求,和列表元素一样,任何数据类型都可以作为值

  • print({'x': 1, 'y': 3, 'x': 4}) # 对于重复的键,打印会自动删去重复项

2.查 - 获取字典的值

  • 切片只针对有序的序列才有效

1)获取单个元素的值

字典[key] - 获取字典中指定key对应的值;如果key不存在,会报错
字典.get(key)/字典.get(key,默认值) - 获取字典中指定的key对应的值;如果key不存在,返回None或者默认值

2)遍历

for key in 字典: 拿到的是字典中所有的key
for value in 字典.values: #拿到的是字典中所有的value
for key,value in 字典.itmes(): #拿到的是字典中所有的键和值

练习

# 1)获取单个元素
dog = {'name': '哈尼', 'age': 3, 'type': '金毛', 'color': '金色'}
print(dog['name'],dog['color'])
print(dog.get('weight', '没有该值'))  # 没有返回默认值
# 2)遍历
# 常用的遍历方式,最好用这种
for x in dog:
    print(x)     # 拿到字典中所有的key
# 不建议使用
for value in dog.values():
    print(value)    # 拿到字典中所有的值value
# 不建议使用
for key,value in dog.items():
    print(key,value)

3.增/改

  • 增 - 添加键值对;
  • 改 - 修改字典中某个key对应的值
  • 语法: 字典[key] = 值 - 当key存在,为修改key对应的值;当key不存在,为添加键值对
dog = {'name': '哈尼', 'age': 3, 'type': '金毛', 'color': '金色'}
dog['weight'] = 34
print(dog)
dog['weight'] = 43
print(dog)

4.删 - 删除key对应的值

"""

  1. del 字典[key] - 删除指定key对应的键值对
  2. 字典.pop(key) - 取出指定key对应的值,但取出后,原字典中key对应的键值对也没有了
dog = {'name': '哈尼', 'age': 3, 'type': '金毛', 'color': '金色'}
del dog['color']
print(dog)   # {'name': '哈尼', 'age': 3, 'type': '金毛'}
type1 = dog.pop('type')
print(dog,type1)    # {'name': '哈尼', 'age': 3} 金毛

5.相关运算

  • 字典不支持: +, *, <, >, >=, <=,
  • 字典只支持: ==, != (字典中只要键值对都相等即为==,不考虑顺序)
print({'name': '哈尼', 'age': 3} == {'name': '哈尼', 'age': 3})  # True
print({'age': 3, 'name': '哈尼'} == {'name': '哈尼', 'age': 3})  # True

6.相关操作: in / not in; max,min,sum,len

  • key in 字典 - 判断字典中是否存在某个键
  • max,min,sum - 针对的是key的操作
  • dict(数据) -将指定数据转换成字典
    • 数据的要求:
      • 1)数据本身是一个序列
      • 2)序列中元素必须是且只有两个元素的小序列
      • 如:[[元素1,元素2],[元素3,元素4]]
print(2 in {'a': 1, 'b': 2})  # False
print('a' in {'a': 1, 'b': 2})  # True

dict1 = {'a': 1, 'z': 2, 'c': 3}
print(max(dict1))  # z 求key的最大值

dict2 = {1: 'a', 2: 'z', 3: 'c'}
print(sum(dict2))  # 6
print(max(dict2))  # 3
print(min(dict2))  # 1
print(len(dict2))  # 3
print(list(dict2))  # [1, 2, 3]
print(dict([[1, 2], [2, 3], [3, 4]]))  # {1: 2, 2: 3, 3: 4}

7.相关方法

  1. 字典.clear() - 清空字典
  2. dict.fromkeys(序列,值=None) - 创建一个新的字典,将序列中的元素作为字典的key,将值作为每一个key对应的值
  3. 字典.item() - 将字典转中的键值对转换成元祖作为容器中的元祖
  4. 字典.values(),字典.keys() - 将值或者键全部取出来
  5. 字典.setdefault(key,value=None) - 在字典中添加键值对(key存在的时候不会有修改的作用)
  6. 字典1.update(字典2) - 将字典2中的键值对全部添加到字典1中

练习

# 2) dict.fromkeys(序列,值=None)  -  创建一个新的字典,将序列中的元素作为字典的key,将值作为每一个key对应的值
print(dict.fromkeys((1, 2, 3, 4), 0))  # {1: 0, 2: 0, 3: 0, 4: 0}
print(dict.fromkeys((1, 2, 3, 4)))  # {1: None, 2: None, 3: None, 4: None}
# 4) 字典.values(),字典.keys()   -   将值或者键全部取出来
dict2 = {1: 'a', 2: 'z', 3: 'c'}
print(dict2.values())   # dict_values(['a', 'z', 'c'])
print(dict2.keys())    # dict_keys([1, 2, 3])
# 5) 字典.setdefault(key,value=None)   -   在字典中添加键值对(key存在的时候不会有修改的作用)
dict2 = {1: 'a', 2: 'z', 3: 'c'}
dict2.setdefault(1, 'e')
dict2.setdefault(4, 'f')
print(dict2)  # {1: 'a', 2: 'z', 3: 'c', 4: 'f'}
# 6) 字典1.update(字典2)   -   将字典2中的键值对全部添加到字典1中
dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'x': 100, 'y': 200, 'a': 123}
dict1.update(dict2)
print(dict1)  # {'a': 123, 'b': 2, 'c': 3, 'x': 100, 'y': 200}
dict2.update([[2, 3], [3, 4]])  # 不一定是字典,可以转化为字典的序列也可以
print(dict2)  # { 'x': 100, 'y': 200, 'a': 123, 2: 3, 3: 4}

练习:用一个列表保存5只狗的信息,每只狗有:名字、年龄、颜色和体重 1)求5只狗的平均年龄 2)找到5只狗体重最大的狗的名字

dogs = [{'name': '哈尼', 'age': 3, 'color': '金色', 'weight': 13},
        {'name': 'lulu', 'age': 1, 'color': '棕色', 'weight': 8},
        {'name': 'TT', 'age': 1.5, 'color': '白色', 'weight': 7},
        {'name': '会长', 'age': 2, 'color': '棕色', 'weight': 13},
        {'name': 'lala', 'age': 2, 'color': '白色', 'weight': 6}]
ages = 0
weights = []
for dog in dogs:
    ages += dog['age']
    weights.append(dog['weight'])
print(weights.count(max(weights)))
print(weights.index(max(weights),weights.index(max(weights))+1,len(weights)))
print(ages/5, dogs[weights.index(max(weights))]['name'])

集合

1.什么是集合(set)

  • 1)集合
    集合是容器型数据类型(序列);将{}作为容器的标志,多个元素用逗号隔开(和字典不一样,集合是独立的数据,不是键值对)
    特点:可变(增删) 、 无序(不支持下标操作)
    注意:{}表示的是空字典 set1 = set()才表示空集合
    如:{1,3,12,34}

  • 2)元素 - 不可变的数据;同一个元素只能有一个(唯一性)
    - 集合自带去重功能

练习

# 1.空集合
set1 =set()
print(type(set1))
set2 = {12,'abs',(1,2)}
print(set2)
# set3 = {'abs',[1,2]}     # TypeError: unhashable type: 'list'
# set4 = {{'a':'b'},True}   # TypeError: unhashable type: 'dict'
# 集合自带去重功能(集合元素的唯一性)
scores = [65,23,34,45,54,23,45,65]
scores = list(set(scores))
print(scores)

2.集合元素的增删改查

1)查 - 只支持遍历,不能单独获取具体某一个元素

names = {'小明', '小米', '张三', '殷夫人'}
for item in names: # for in的遍历都是通过转化为列表,根据下标进行遍历
print(item)

2) 增:

  • 集合.add(元素) - 在集合中添加一个元素
  • 集合.update(不可变序列) - 将序列中所有的元素添加到集合中
    names.add('哪吒')
    print(names)
    names.update(['敖丙','龙王'])
    names.update('yes') # 会将字符串拆分后添加
    print(names)

3) 删除 - 删除元素

  • 集合.remove(元素) - 删除集合中指定的元素
    names.remove('张三')
    print(names)

4) 改(集合不支持修改元素的操作)

2.数学的集合运算:

set1 = {1, 2, 3, 4, 5, 6}
set2 = {1, 2, 3, 4, 7, 9, 10}

1)求交集:集合1 & 集合2

print(set1 & set2) # {1, 2, 3, 4}

2)求并集:集合1 | 集合2

print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7, 9, 10}

3)求差集:集合1 - 集合2 获取集合1中除了集合2中的元素剩下的部分

print(set1-set2) # {5, 6}
print(set2-set1) # {9, 10, 7}

4) 求对称差集: 集合1 ^ 集合2 获取两个集合除了公共部分剩下的部分

print(set1 ^ set2) # {5, 6, 7, 9, 10}

5) 集合1 > 集合2 判断集合1中是否包含集合2

print({9, 10, 11, 12} > {1, 2, 3}) # False
print({9, 10, 11, 12} > {9,10}) # True

6) 集合1 < 集合2 判断集合2中是否包含集合1

print({9, 10, 11, 12} < {9,10}) # False
print({9, 10, 11, 12} < {9,10,11,12,13,14}) # True

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