本文标题:数据结构:元组,集合,,列表,字典

本文链接:http://7r4ck3r.top/index.php/archives/5/

除非另有说明,本作品遵循CC 4.0 BY-SA 版权协议

声明:转载请注明文章来源。

前几天有人问我这些的区别是什么,我愣了一下,刚好今天重新过一遍数据结构,也就顺便整理一下了

元组:

是由数个逗号分割的值组成: a = 'jks','sss','ssa','wdd' print(a[1])
元组是不可变类型,这意味着你不能在元组内删除或添加或编辑任何值。

>>> a = (1, 2, 3, 4)
>>> del a[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item deletion

要创建只含有一个元素的元组,在值后面跟一个逗号。
以上呢元组的概念

集合:

集合是一个无序不重复元素的集。大括号或 set() 函数可以用来创建集合。注意:想要创建空集合,你必须使用 set() 而不是 {}
如果集合中有一样的元素,例如两个'bbb',最后print出来的都会删除多余的元素。
当然以下是借用蓝桥云课免费版的教学引用

a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # a 去重后的字母
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # a 有而 b 没有的字母
{'r', 'd', 'b'}
>>> a | b                              # 存在于 a 或 b 的字母
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # a 和 b 都有的字母
{'a', 'c'}
>>> a ^ b                              # 存在于 a 或 b 但不同时存在的字母
{'r', 'd', 'b', 'm', 'z', 'l'}

除此之外,可以用集合的名字.pop()随机打印出来一个元素,并删除 集合的名字.add('s')可以在集合里面添加一个新的元素.

列表

>>> a = [11, 25, 1111, -3434, 1116, 234]
>>> a.append(45)
>>> a
[11, 25, 1111, -3434, 1116, 234, 45]

还可以用

a.insert(0, 1111)   #在列表索引 0 位置添加元素 1111

还有很多函数

a.count()        #意思是去检测某一个数字在列表中出现的个数
a.remove()       #可以删除一个元素
a.reverse        #翻转列表
a.extend(b)      #将b元素添加进a元素

栈是我们通常所说的一种 LIFO (Last In First Out 后进先出)数据结构。它的意思是最后进入的数据第一个出来。一个最简单的例子往一端封闭的管道放入一些弹珠然后取出来,如果你想把弹珠取出来,你必须从你最后放入弹珠的位置挨个拿出来。

>>> a = [1, 2, 3, 4, 5, 6]
>>> a
[1, 2, 3, 4, 5, 6]
>>> a.pop()
6
>>> a.pop()
5
>>> a.pop()
4
>>> a.pop()
3
>>> a
[1, 2]
>>> a.append(34)
>>> a
[1, 2, 34]

上面的代码中我们使用了一个新方法 pop()。传入一个参数 i 即 pop(i) 会将第 i 个元素弹出。

在我们的日常生活中会经常遇到队列,比如售票窗口、图书馆、超市的结账出口。队列 是一种在末尾追加数据以及在开始弹出数据的数据结构。与栈不同,它是 FIFO (First In First Out 先进先出)的数据结构。

>>> a = [1, 2, 3, 4, 5]
>>> a.append(1)
>>> a
[1, 2, 3, 4, 5, 1]
>>> a.pop(0)
1
>>> a.pop(0)
2
>>> a
[3, 4, 5, 1]

字典

字典是无序的键值对(key:value)集合,同一个字典内的键必须是互不相同的。一对大括号 {} 创建一个空字典。初始化字典时,在大括号内放置一组逗号分隔的键:值对,这也是字典输出的方式。我们使用键来检索存储在字典中的数据。


>>> a = {'ssss':'121', 'jks' :'sqs', 'usbn':'1sqz'}
>>> a
{'ssss': '121', 'jks': 'sqs', 'usbn': '1sqz'}
>>> a['ssss']
'121'
>>> del a['jks']
>>> a
{'ssss': '121', 'usbn': '1sqz'}
>>> '121' in a
False
a
{'ssss': '121', 'usbn': '1sqz'}
>>> for x,y in a.items():
...     print("{} to {}".format(x,y))
... 
ssss to 121
usbn to 1sqz      #可以用items()函数进行遍历字典

许多时候我们需要往字典中的元素添加数据,我们首先要判断这个元素是否存在,不存在则创建一个默认值。如果在循环里执行这个操作,每次迭代都需要判断一次,降低程序性能。
我们可以使用 dict.setdefault(key, default) 更有效率的完成这个事情。

>>> b = {}
>>> b
{}
>>> b.setdefault('aaa',[]).append('1111')
>>> b
{'aaa': ['1111']}
>>> b.setdefault('aaa',[]).append('klj')
>>> b
{'aaa': ['1111', 'klj']}

试图索引一个不存在的键将会抛出一个 keyError 错误。我们可以使用 dict.get(key, default) 来索引键(例如a.get()),如果键不存在,那么返回指定的 default 值。


>>> b
{'aaa': ['1111', 'klj']}
>>> b['aaaa']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'aaaa'
>>> b.get('aaaa',0)
0

如果你想要在遍历列表(或任何序列类型)的同时获得元素索引值,你可以使用 enumerate()。也许需要同时遍历两个序列类型,你可以使用 zip() 函数

>>> for i, j in enumerate(['a', 'b', 'c']):
...     print(i, j)
...
0 a
1 b
2 c


>>> a = ['Pradeepto', 'Kushal']
>>> b = ['OpenSUSE', 'Fedora']
>>> for x, y in zip(a, b):
...     print("{} uses {}".format(x, y))
...
Pradeepto uses OpenSUSE
Kushal uses Fedora

接下来会有练习

这是一个判断学生成绩是否达标的程序,要求输入学生数量,以及各个学生物理、数学、历史三科的成绩,如果总成绩小于 120,程序打印 “failed”,否则打印 “passed”。

n = int(input("Enter a number of students: ")) ##输入学生的数量,只能是整数
data = {}  ##用来储存数据的字典变量
sub = ('physics', 'math', 'history') ##科目
for i in range(1,n+1):
    name = input('Enter students name{}: '.format(i))
    marks = []                   ##列表,储存成绩的
    for x in  sub:               #给三个科目赋予成绩
        marks.append(int(input('Enter marks {}:'.format(x)))) #将输入的成绩加入到marks 列表之中
    data[name] = marks          #学生数据储存到data字典
for x, y in data.items():       #遍历字典
    total = sum(y)              #sum() 函数会将传入的列表进行加和。
    print("{}'s total marks is {}".format(x, total))
    if total < 120:
        print(x, "failed")
    else:
        print(x, "passed")

如果想增添如果输入成绩大于一个数字(例如100分)),则报错并退出程序的功能

n = int(input("Enter a number of students: "))  # 输入学生的数量,只能是整数
data = {}  # 用来储存数据的字典变量
sub = ('physics', 'math', 'history')  # 科目

for i in range(1, n + 1):
    name = input('Enter student\'s name {}: '.format(i))
    marks = []  # 列表,储存成绩的

    for x in sub:  # 给三个科目赋予成绩
        mark = int(input('Enter marks for {}: '.format(x)))

        if mark > 100:
            print("Invalid input: marks cannot be greater than 100.")
            exit()

        marks.append(mark)  # 将输入的成绩加入到marks列表之中

    data[name] = marks  # 学生数据储存到data字典

for x, y in data.items():  # 遍历字典
    total = sum(y)  # sum() 函数会将传入的列表进行加和。
    print("{}'s total marks are {}".format(x, total))

    if total < 120:
        print(x, "failed")
    else:
        print(x, "passed")
最后修改:2024 年 07 月 06 日
如果觉得我的文章对你有用,请随意赞赏