Python之dict和set

154 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

dict

Python的字典就和java中的Map、go中的map一样,是一个键值对,目的是为了通过key快速找到value,而不用像列表一样只能遍历。

image.png

创建

创建空字典

if __name__ == '__main__':
    emptyDirct = {}
    print(emptyDirct)

使用内建函数创建字典

# 使用内建函数创建字典
dictCreate = dict(name="whf", age="18")
print(dictCreate["age"])

访问

# 访问字典里面的值
tinydict = {"唐诗": "第1-100页", "宋词": "第101-200页"}
print(tinydict["唐诗"])

没有会返回错误:

# 访问字典里面的值
tinydict = {"唐诗": "第1-100页", "宋词": "第101-200页"}
print(tinydict["清词"])

输出:

Traceback (most recent call last):
  File "/Users/wanghaifeng/PycharmProjects/study/basic/dirct/DirectDemo.py", line 10, in <module>
    print(tinydict["清词"])
KeyError: '清词'

修改字典

# 修改字典
tinydict = {"唐诗": "第1-100页", "宋词": "第101-200页"}
tinydict["唐诗"] = "第10-100页"
print(tinydict["唐诗"]

删除

# 删除某个键
tinydict = {"唐诗": "第1-100页", "宋词": "第101-200页"}
del tinydict["宋词"]

清空字典

# 清空
tinydict = {"唐诗": "第1-100页", "宋词": "第101-200页"}
tinydict.clear()
print(tinydict)

删除字典

# 删除字典
tinydict = {"唐诗": "第1-100页", "宋词": "第101-200页"}
del tinydict
print(tinydict)

输出:

Traceback (most recent call last):
  File "/Users/wanghaifeng/PycharmProjects/study/basic/dirct/DirectDemo.py", line 33, in <module>
    print(tinydict)
NameError: name 'tinydict' is not defined

键必须不可变

可以用数字、字符串、元组,而列表不行:

# 可以用数字、字符串、元组,而列表不行
tinydict = {['name']: 'whf'}
print(tinydict[['name']])

输出:

Traceback (most recent call last):
  File "/Users/wanghaifeng/PycharmProjects/study/basic/dirct/DirectDemo.py", line 34, in <module>
    tinydict = {['name']: 'whf'}
TypeError: unhashable type: 'list'

但是java可以:

public static void main(String[] args) {
    Map<List, Integer> map = new HashMap<>();
    ArrayList arrayList = new ArrayList();
    map.put(arrayList, 1);
    System.out.println(map.get(arrayList));
    arrayList.add(1);
    System.out.println(map.get(arrayList));
}

输出:

1
null

笔者觉得py的更合理,可变的hash也会变,所以后面就找不到了,没有意义。

set

集合是一个无序的不重复元素序列。

可以使用大括号{}或者set()函数创建集合,注意:创建一个空集合必须用set()而不是{},因为{}是用来创建一个空字典。

创建空集合

if __name__ == '__main__':
    # 创建空集合
    emptySet = set()
    print(emptySet)

去重

# 去重展示
norepeat = {"whf", "hf", "whf"}
print(norepeat)

输出:

{'whf', 'hf'}

判断是否在集合内

# 查看是否存在
ordinarySet = {"whf", "hf"}
print("wf" in ordinarySet)

添加元素

# 添加元素
ordinarySet = {"whf", "hf"}
ordinarySet.add("wf")
print(ordinarySet)

如果已经存在则不进行任何操作。

update可以添加列表、元组、字典等:

# 添加元素
ordinarySet = {"whf", "hf"}
ordinarySet.update({"key": "value"})
ordinarySet.update([1, 2])
print(ordinarySet)

很明显,和java一样set是利用map的key保证不重复的。

移除元素

  • 不存在会发现错误,remove:
# 移除元素,不存在会发现错误
thisset = set(("1", "2", "3"))
thisset.remove("1")
print(thisset)
thisset.remove("4")

输出:

{'2', '3'}
Traceback (most recent call last):
  File "/Users/wanghaifeng/PycharmProjects/study/basic/set/SetDemo.py", line 29, in <module>
    thisset.remove("4")
KeyError: '4'
  • 不存在不会发生错误,discard:
# 移除元素,不存在会发现错误
thisset = set(("1", "2", "3"))
thisset.remove("1")
print(thisset)
thisset.discard("4")

输出:

{'3', '2'}
  • 随机删除,pop:
# 随机删除
thisset = set(("1", "2", "3"))
x = thisset.pop()
print(x)

输出:

2

清空集合

# 清空集合
thisset = set(("1", "2", "3"))
thisset.clear()
print(thisset)

输出:

set()

判断是否在集合中存在

# 判断是否在集合中存在
thisset = set(("1", "2", "3"))
print(4 in thisset)

输出:

False