乐趣区

关于python:抬抬小手学Python-说完列表说字典说完字典说集合

字典与汇合那些事儿

字典和汇合为何总要放在一起,说来也巧,就是因为它们都用大括号 {} 包裹。

字典和汇合那些根底操作

先说字典

字典是由键值对组成的,键为 Key,值为 Value,标记一下,在 Python3.6 之前字典是无需的,长度大小可变,元素也能够任意的删除和扭转,在 Python 3.7 之后,字典有序了。

为了测试字典的无序性,我专门在 Python 线上环境进行了测试,代码如下:

my_dict = {}
my_dict["A"] = "A"
my_dict["B"] = "B"
my_dict["C"] = "C"
my_dict["D"] = "D"

for key in my_dict:
    print(key)

运行后果也证实了无序性。

在本地 Python 3.8 版本测试,没有呈现乱序的状况。

所以再有人问 Python 外面的字典有没有程序呀,不要间接答复无序了,这玩意当初有程序。

字典这种键值对构造,相较于列表与元组更加适宜增加元素、删除元素、查找元素等操作。

字典的创立不在细说,滚雪球第一遍学习的时候,曾经波及了,须要留神的是索引键的时候,如果键不存在,会呈现 KeyError 谬误,该谬误属于极其常见谬误。

my_dict = {}
my_dict["A"] = "A"
my_dict["B"] = "B"
my_dict["C"] = "C"
my_dict["D"] = "D"

print(my_dict["F"])

谬误提醒如下:

Traceback (most recent call last):
  File ".\demo.py", line 7, in <module>
    print(my_dict["F"])
KeyError: 'F'

如果你不心愿此异样呈现,在索引键的时候应用 get(key,default) 函数即可。

print(my_dict.get("F","None"))

再聊汇合

汇合和字典根本构造雷同,最大的区别是汇合没有键值对,它是一系列无序且惟一的元素组合。
汇合不反对索引操作,也就是说上面的代码必定是会报错的。

my_set = {"A","B","C"}
print(my_set[0])

异样提醒为类型谬误:TypeError: 'set' object is not subscriptable

其余重点记忆的就是汇合常常用在去重操作上,把握即可。

字典与汇合的排序

基本操作仍旧不在过多解释,须要的能够去第一遍滚雪球学习,这里强调一下排序函数,因为波及了一些扩大知识点,能够先接触一下,前面对于局部内容还会细讲。

学习之前,你要记住,对汇合进行 pop 操作,失去的元素是不确定的,因为汇合无序,具体你能够测试如下代码:

my_set = {"A","B","C"}
print(my_set.pop())

如果心愿对字典排序,依照咱们已知的技术,能够这样进行。
以下内容为 Python3.6 版本以下运行后果。

间接应用 sorted 函数即可对字典排序,排序的时候,还能够指定依照键或者值进行排序,例如依照字典值升序排序。

my_dict = {}
my_dict["A"] = "4"
my_dict["B"] = "3"
my_dict["C"] = "2"
my_dict["D"] = "1"
sorted_dict = sorted(my_dict.items(),key=lambda x:x[1])
print(sorted_dict)

输入后果如下,失去的后果是依照字典的值进行排序的,这里须要留神的是 lambda 匿名函数在后续的课程将逐渐开展

[('D', '1'), ('C', '2'), ('B', '3'), ('A', '4')]

汇合排序无特地阐明,间接应用 sorted 函数即可。

字典与汇合的效率问题

字典与汇合的效率问题,次要比照的对象是列表,假如当初有一堆学号和体重的数据,咱们须要判断出不同体重数的学生人数。
需要形容如下:
有 4 个学生,依照学号排序造成的元组为 (1,90)(2,90)(3,60)(4,100),最终的后果输入 3(存在三个不同的体重)
依照需要编写代码如下:
列表写法

def find_unique_weight(students):
    # 申明一个统计列表
    unique_list = []
    # 循环所有学生数据
    for id, weight in students:
        # 如果体重没有在统计列表中
        if weight not in unique_list:
            # 新增体重数据
            unique_list.append(weight)
    # 计算列表长度
    ret = len(unique_list)
    return ret

students = [(1, 90),
    (2, 90),
    (3, 60),
    (4, 100)
]
print(find_unique_weight(students))

接下来上述代码批改为 汇合写法


def find_unique_weight(students):
    # 申明一个统计汇合
    unique_set = set()
    # 循环所有学生数据
    for id, weight in students:
        # 汇合会主动过滤反复数据
        unique_set.add(weight)
    # 计算汇合长度
    ret = len(unique_set)
    return ret

代码写完之后,并未发现有太大的差别,然而如果把数据扩充到更大的两集,例如上万数据。
以下代码工夫计算函数利用的是 time.perf_counter() 该函数第一次调用时,从计算机系统里随机选一个工夫点 A,计算其间隔以后工夫点 B1 有多少秒。当第二次调用该函数时,默认从第一次调用的工夫点 A 算起,间隔以后工夫点 B2 有多少秒。两个函数取差,即实现从工夫点 B1 到 B2 的计时性能,首先联合列表计算的函数,运行下述代码

import time
id = [x for x in range(1, 10000)]
# 体重数据为了计算,也只能从 1 到 10000 了
weight = [x for x in range(1, 10000)]
students = list(zip(id, weight))

start_time = time.perf_counter()
# 调用列表计算函数
find_unique_weight(students)
end_time = time.perf_counter()
print("运算工夫为:{}".format(end_time - start_time))

运行工夫为 1.7326523,每台电脑运行速度不统一,具体看差别。
批改上述代码运行到汇合编写的函数上,最终失去的后果为 0.0030606,能够看到在 10000 条数据的量级下就曾经产生了如此大的差别,如果数量级在进行回升,差别会再次加大,所以你理解到该用什么内容了吗?

这篇博客的总结

这篇博客,咱们对字典与汇合相干的常识进行了补充,有一个常识橡皮擦仍旧进行了略过,就是字典与汇合的存储原理,具体会波及到哈希表构造相干常识,这部分对高级利用影响不大,所以临时略过,对于字典与汇合来说,如果你在编写程序中须要高效查找数据、去重数据,倡议及时的把二者利用起来。

退出移动版