Python中的字典与集合

1.字典

字典,类似于我们日常中所使用的字典,是一种映射存储的方式字典分为两个部分,一个是键(key),一个是key所关联的值(value)。我们可以认为,一个键关联(或绑定)一个值,称为键值对。字典就是以键值对的形式来存储数据的。

字典的特点:

  • 字典中的键值对是无序的
  • 字典中的key不能重复
  • 字典中的key必须是不可变类型(可哈希)

1.1 字典的创建

可以使用如下方式来创建字典:

使用键值对:

x = {“a”: 100, “b”: 200}

使用dict函数:

x = dict(a=100, b=100)

空字典:

dnull={}

创建字典后也可以增加或删除字典的键值对,如果key已经存在,则修改value,如果不存在,则新创建键值对:

x[“new_key”] = “new value”
del x[“new_key”]

说明:

  • 访问字典中的元素不能使用索引,因为字典是无序的,访问字典的正确方法是通过key来访问,如字典[key]返回value。
  • 字典跟列表相比,牺牲空间来提高时间。
  • 定义字典的时候如果出现重复的key,会使用最后一个赋值将之前的key-value覆盖。

1.2 字典相关方法

  • get(key[, default])
  • pop(key[, default])
  • keys()
  • values()
  • items()
  • clear()
  • setdefault(key[,default])
  • update([E, ]**F)
  • popitem()
  • fromkeys(iterable, value=None)
  • copy()

1.3 字典的运算

字典不支持 + * > <,字典支持如下的运算符:

符号说明
e in x如果x中存在e键,返回True,否则返回False。
e not in x如果x中不存在e键,返回True,否则返回False。
x ==,!= y比较x,y的键值对.
x is,is not y判断x,y是否为同一个字典
x 布尔 y与数值类型的布尔运算规则相同(返回两个字典中的一个)

说明:

  • 假设上表中,x与y是字典类型,e为某元素(代表键)。
  • 字典不支持 >= 与 <= 运算。
  • len函数也可以应用与字典类型,返回字典中键值对的个数。

1.4 字典的遍历

①通过keys()遍历:

b={4:"php",5:"c++",9:[1,2,3]}
print(b.keys())
for i in b.keys():
    print(i,b[i])

②通过values()遍历:

print(b.values())
for i in b.values():
    print(i)

③通过items()遍历:

print(b.items())
for k,v in b.items():
    print(k,v)
for i in b.items():
    print(i[0],i[1])
for i in b.items():
    print(i)

1.5 字典推导式

{输出表达式 for k,v in 字典}

b={4:"php",5:"c++",9:[1,2,3]}
new_b = {k*2:v for k,v in b.items()}
print(new_b)

# output:
# {8: 'php', 10: 'c++', 18: [1, 2, 3]}

2.集合

2.1集合的创建

集合可以包含一组元素,与字典类似,也是使用{}来表示。不同的是,字典存储的是一组键值对,而集合存储的是单一元素。看成是value值为none的字典.

例如:

s = {1, 2, 3, 4}

如果在创建集合时,指定了重复的元素,则重复的元素会自动的去除。如果想要创建一个空的集合,不能使用:

s = {}

而是需要使用:

s = set()

因为前者创建的不是空的集合,而是空的字典。

2.2 集合的特征

集合具有如下特征:

  • 集合中不含有重复的元素。
  • 集合中不保证元素是有顺序的。
  • 集合中的元素类型必须是可哈希类型。

2.3 集合的运算

集合支持以下运算:

符号说明
e in x如果x中存在e键,返回True,否则返回False。
e not in x如果x中不存在e键,返回True,否则返回False。
x & y返回x与y的交集,相当于x. intersection(y)。
x l y返回x与y的并集,相当于x.union(y)。
x - y返回x与y的差集,相当于x. difference(y)。
x ^ y返回x与y的对称差集,相当于x. symmetric_difference(y)。
x ==,!= y比较x,y中的元素是否一致。
x >,>=,<=,< y比较x是否为y的父集(子集)
x is,is not y判断两个集合是否为同一个集合
x 布尔 y与数值类型的布尔运算规则相同(返回两个集合中的一个)

说明:假设上表中,x与y是集合类型,e为某元素。

2.4 相关方法

add(elem)
remove(elem)
discard(elem)
pop()
clear()
copy()
difference(*s)
difference_update(*s)
intersection(*s)
intersection_update(*s)
union(*s)
update(*s)
symmetric_difference(s)
symmetric_difference_update(s)
isdisjoint(s)
issubset(s)
issuperset(s)

2.5 集合的遍历

b={"a","b","c","d","f","h"}
for i in b:
    print(i)

2.6 集合的推导式

a={1,2,3,4}
b={"a","b","c"}
print({i*2 for i in a})
print({i*2 for i in b})
print({i+"_new" for i in b})

3.字典与集合总结

字典是一系列无序元素的组合,其长度大小可变,元素可以任意地删减和改变。不过要注意,这里的元素,是一对键(key)和值(value)的配对。

相比于列表和元组,字典的性能更优,特别是对于查找、添加和删除操作,字典都能在常数时间复杂度内完成,这是因为字典的内部组成是一张哈希表,你可以通过键的哈希值,快速找到其对应的值。

对于字典,我们通常会根据键或值,进行升序或降序排序,由于字典本身是无序的,所以会返回一个列表。列表中的每个元素,是由原字典的键和值组成的元组。

而对于集合,其排序和前面讲过的列表、元组很类似,直接调用sorted(set)即可,结果会返回一个排好序的列表。

d = {'b': 1, 'a': 2, 'c': 10}
d_sorted_by_key = sorted(d.items(), key=lambda x: x[0]) # 根据字典键的升序排序
d_sorted_by_value = sorted(d.items(), key=lambda x: x[1]) # 根据字典值的升序排序

print(d_sorted_by_key)
print(d_sorted_by_value)

# output:
#[('a', 2), ('b', 1), ('c', 10)]
#[('b', 1), ('a', 2), ('c', 10)]  

s = {3, 4, 2, 1}
print(sorted(s)) # 对集合的元素进⾏升序排序

# output:
#[1, 2, 3, 4]  

而集合和字典基本相同,唯一的区别,就是集合没有键和值的配对,是一系列无序的、唯一的元素组合。需要注意的是,集合并不支持索引操作,因为集合本质上是一个哈希表,和列表不一样。

s = {1,2,3}
s [0]

# output:
# TypeError                                 Traceback (most recent call last)
# <ipython-input-5-70f42fd79648> in <module>
#       1 s = {1,2,3}
# ----> 2 s [0]

# TypeError: 'set' object is not subscriptable

4.常见数据类型转换

int(x)	#将x转换成为一个整数
float(x) #将x转换成为一个浮点数
str(x)	#将x转换成为一个字符串
bool(x)	#将x转换成为布尔类型
tuple(s) #将序列转换成元组
list(s)	#将序列转换成列表
set(s) #将序列转换成集合
dict(d)	#将一个元素为kw形式的序列转换成字典
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值