A. python其实很简单 第九章 列表与元组(一)
在前面,我们要保存一个数据,需要先定义一个变量,而且一个变量中只能保存一个数据。譬如,语句:a1=1,值“1”就被保存了,但要保存“2”,就还需要再定义一个变量:a2=2......这样以来,随着数据的增多,岂不是要定义更多的变量吗?
可以使用一个新的数据类型,它记录很多数据,并且将它们按照顺序存储在连续的内存空间中,这便是序列。Python中有5种常用的序列结构,分别是列表、元组、集合、字典和字符串。
9.1列表
语法格式:
listname=[element1,element2,element3,......,elementn]
其中,listname为列表名,element1,element2,element3,......,elementn表示列表中的元素。各个元素的数据类型可以相同,也可以不同,但通常元素的类型都是相同的,含义也是相同的。
如:
list1=[‘风’,’马‘,’牛’,1,2,3,’a’,’b’,’c’]就没有太多的实际用途。
list2=['张三','男',18,']虽然元素的类型不同,但表示了同一个人的信息。
1、访问列表元素
列表中元素的索引号从0开始标记,访问列表元素时,可以直接按照索引号读取。
如:
list2=['张三','男',18,']
print(list2[1]) #输出列表中索引号为1的元素
输出结果:男
和字符串一样,序列都是可以使用切片操作的。
如:
print(list2[:2])
输出结果:['张三', '男']
print(list2[2:])
输出结果:[18, ']
2、使用range()函数创建数值列表
格式:range(start, stop [,step]) ;start 指的是计数起始值,默认是 0;stop 指的是计数结束值,但不包括 stop ;step 是步长,默认为 1,不可以为 0 。range() 方法生成一段左闭右开的整数范围。
可以使用range()函数创建数值列表,如:
list1=list(range(10,20,2))
print(list1)
运行结果:[10, 12, 14, 16, 18]
3、删除列表
语法格式如下:
del listname
其中,listname为要删除列表的名称。
删除列表与删除变量的方法是完全一样的,前面已经介绍过了。
4、遍历列表
常用的遍历列表的方法有是利用for语句,举例如下:
list1=list(range(10))
for item in list1:
print(item,end=' ') # end=’ ‘表示以空格结束,如果不写这个参数,相当于默认值end=’ ’
输出结果:0 1 2 3 4 5 6 7 8 9
为了获取列表元素的索引值,就需要使用enumerate()函数。
list1=list(range(10,20,2))
for index,item in enumerate(list1):
print(index,'-',item,end=' ')
输出结果:0 - 10 1 - 12 2 - 14 3 - 16 4 - 18
5、追加、修改和删除列表元素
追加元素
>>> list1=['春','夏','秋']
>>> list1.append('冬')
>>> list1
['春', '夏', '秋', '冬']
还有一种方法,就是使用“+”号将两个序列连接起来。如:
list1=['春','夏','秋']
list1=list1+['冬']
print(list1)
输出结果为:['春', '夏', '秋', '冬']
注意,下面的做法是错误的:
>>> list1=['春','夏','秋']
>>> list1=list1+'冬'
Traceback (most recent call last):
File " ", line 1, in
list1=list1+'冬'
TypeError: can only concatenate list (not "str") to list
从这个提示可知,列表只能与列表连接,而不能与字符串连接。
修改元素
>>> list1[2]='autumn' #通过索引对元素直接赋值
>>> print(list1)
['春', '夏', 'autumn', '冬']
删除元素
>>> del list1[2] #通过索引直接删除元素
>>> print(list1)
['春', '夏', '冬']
6、列表元素排序
在讨论列表元素排序时,为了将有序列表变成无序列表,这里用到了shuffle()函数,但它不是Python的内置函数,需要先使用import语句将random模块包含进来,这样才能像使用内置函数那样使用扩展模块中的函数。
>>> import random #导入random模块
>>> list1=list(range(10)) #生成列表,元素为0到9的整数。
>>> list1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> random.shuffle(list1) #用random包中的shuffle()函数将list1中元素次序打乱
>>> list1
[8, 6, 3, 5, 0, 7, 1, 9, 2, 4]
>>> list1.sort() #对list1升序排列
>>> list1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> random.shuffle(list1) #将list1顺序重新打乱
>>> list1
[5, 9, 7, 8, 4, 3, 2, 0, 6, 1]
>>> list1.sort(reverse=True) #对list1降序排列
>>> list1
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
方法sort()的语法格式:
listname.sort(key=None,reverse=False)
其中,listname表示要排序的列表;key表示指定一个键,如”key=str.lower”表示排序时不区分字母大小写;reverse为True表示降序排列(为默认值,可省缺),为False表示升序排列。
还有一个函数sorted(),功能与方法sort()相似。格式如下:
sorted(listname,key=None,reverse=False)
7、 利用列表推导式快速生成一个列表
例1:生成指定范围的数值列表。
>>> import random
>>> list1=[random.randint(0,20) for i in range(10)]
>>> list1
[16, 20, 19, 6, 5, 7, 10, 5, 12, 5] #生成了包含10个值在0到20之间的元素构成的列表。
例2:根据现有列表生成新的列表。
>>> radius=list(range(1,6)) #生成列表 radius保存半径的值
>>> radius
[1, 2, 3, 4, 5]
>>> s=[round(2*3.14*r,2) for r in radius]
#生成列表s,将计算得到的周长值保存起来,其中round()可以保留指定小数位,格式 round(var, n),var为变量名,n为指定保留小数位。
>>> s
[6.28, 12.56, 18.84, 25.12, 31.4]
例3:从列表中选择符合条件的元素组成新的列表。
>>> score=[98,65,77,56,82,89] #列表score用来存储成绩
>>> good=[x for x in score if x>=80]
#从列表score中选取>=80的元素存入新列表good中
>>> good
[98, 82, 89]
count()、index()和sum()方法
count()方法
用于统计指定元素在列表中出现的次数。
例:
>>> list1=['a','b','c','d','e','f','c','d','e','a','b','c','d']
>>> num=list1.count('c') #统计列表list1中'c'的个数
>>> num
3
index()方法
用于获取指定元素在列表中第一次出现的索引值。
>>> list1=['a','b','c','d','e','f','c','d','e','a','b','c','d']
>>> position=list1.index('c')
>>> position
2
sum()方法
用于计算数值列表中全部或指定元素的和。
>>> list1=[1,2,3,4,5]
>>> total=sum(list1) #计算列表list1中全部元素的和
>>> total
15
>>> total=sum(list1,1) #在列表list1全部元素的和后,在加上参数(“1”)的值
>>> total
16
>>> total=sum(list1[:2]) #计算切片list1[:2]中各元素的和
>>> total
3
二维列表
格式:listname[下标1][下标2]
其中,listname表示列表的名称,下标1表示列表中的行号,下标2表示列表中的列号。对于n行m列的二维列表,第一个元素的行号和列号都是0,最后一个元素的行号和列号都是n-1。如下所示:
list[0][0] list[0][1] list[0][2] ............ list[0][m-1]
list[1][0] list[1][1] list[1][2] ............ list[1][m-1]
......
......
list[n-1][0] list[n-1][1] list[n-1][2] ............ list[n-1][m-1]
通俗地讲,如果一个列表中的元素本身就是一个列表,则这个列表就是一个二维列表。
如:
>>> list1=['a1','b1','c1','d1']
>>> list2=['a2','b2','c2','d2']
>>> list3=['a3','b3','c3','d3']
>>> listtwo=[list1,list2,list3]
>>> listtwo
[['a1', 'b1', 'c1', 'd1'], ['a2', 'b2', 'c2', 'd2'], ['a3', 'b3', 'c3', 'd3']]
如果要查看二维列表listtwo按照行、列的排列,可以运行如下代码:
for i in range(3):
for j in range(4):
print(listtwo[i][j],end=' ')
print()
运行结果:
a1 b1 c1 d1
a2 b2 c2 d2
a3 b3 c3 d3
如果要读取二维列表中的某一行,可以使用如下方法:
>>> listtwo[2] #读取第3行的元素(注意索引号都是从0开始的)
['a3', 'b3', 'c3', 'd3']
如果要读取某一个元素的值,可以使用如下方法:
>>> listtwo[2][2] #读取第3行第3列的元素
'c3'
B. Python学习小技巧之列表项的排序
Python学习小技巧之列表项的排序
本文介绍的是关于Python列表项排序的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:
典型代码1:
data_list = [6, 9, 1, 3, 0, 10, 100, -100]
data_list.sort()
print(data_list)
输出1:
[-100, 0, 1, 3, 6, 9, 10, 100]
典型代码2:
data_list = [6, 9, 1, 3, 0, 10, 100, -100]
data_list_ = sorted(data_list)
print(data_list)
print(data_list_)
输出2:
[6, 9, 1, 3, 0, 10, 100, -100]
[-100, 0, 1, 3, 6, 9, 10, 100]
应用场景
需要对列表中的项进行排序时使用。其中典型代码1是使用的列表自身的一个排序方法sort,这个方法自动按照升序排序,并且是原地排序,被排序的列表本身会被修改;典型代码2是调用的内置函数sort,会产生一个新的经过排序后的列表对象,原列表不受影响。这两种方式接受的参数几乎是一样的,他们都接受一个key参数,这个参数用来指定用对象的哪一部分为排序的依据:
data_list = [(0, 100), (77, 34), (55, 97)]
data_list.sort(key=lambda x: x[1]) # 我们想要基于列表项的第二个数进行排序
print(data_list)
>>> [(77, 34), (55, 97), (0, 100)]
另外一个经常使用的参数是reverse,用来指定是否按照倒序排序,默认为False:
data_list = [(0, 100), (77, 34), (55, 97)]
data_list.sort(key=lambda x: x[1], reverse=True) # 我们想要基于列表项的第二个数进行排序,并倒序
print(data_list)
>>> [(0, 100), (55, 97), (77, 34)]
带来的好处
1. 内置的排序方法,执行效率高,表达能力强,使代码更加紧凑,已读
2. 灵活的参数,用于指定排序的基准,比在类似于java的语言中需要写一个comparator要方便很多
其它说明
1. sorted内置函数比列表的sort方法要适用范围更广泛,它可以对除列表之外的可迭代数据结构进行排序;
2. list内置的sort方法,属于原地排序,理论上能够节省内存的消耗;
总结
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助
C. Python的程序结构是如何体现的
在Python中,程序的结构反映在代码的组织和编写方式上。
Python 程序由一系列语句组成,这些语句按顺序执行。这些语句可以包括赋值、函数调用、控制语句(如 if 语句和 for 循环)和其他构造。
缩进用于指示代码的结构。例如,只有在满足特定条件时才执行的代码块将在 if 语句下缩进。这有助于使代码更具可读性和更易于理解。
除了 Python 程序的基本结构之外,还可以遵循各种设计模式和最佳实践,以使代码更易于维护和高效。其中包括使用函数将代码组织到逻辑单元中、使用类定义可重用对象以及使用模块将代码组织到单独的文件中。
总体而言,Python 程序的结构反映了代码的组织和编写方式,并遵循可维护性和效率的最佳实践。
D. python的程序结构有哪几种
①顺序结构:即语句从上到下按顺序执行
②分支结构:一条大路,会有很多分支路口。在python常用if..elif..else判断语句
③循环结构:例如像放歌一样,歌单循环播放。在python常用while循环或是for循环
E. 一文搞懂python数据类型和结构
每次python从入门到精通都是从头开始看,做这个学习笔记主要是为了让自己可以省去学习数据类型和结构那几章的时间,所以“偷懒”可以促进生产力发展......
分别是: 整数型、浮点型、复数、常量、布尔型、字符串 。其中复数基本不会使用到,可以不用太关注
分别是 列表、字典、集合和元组 ,其中最常见并且工作中经常使用到的就是列表和字段,其他两个不常见。
02、字典
列表之外,字典可能是python中用的也比较多的数据结构了,由于字典的底层应用哈希映射,所以要求字典的所有key必须是不可变元素(可哈希对象),增删改查操作一般都能实现O(1)复杂度,是低复杂度的必备数据结构。
03、集合
集合(set)是一个无序的不重复元素序列。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
集合操作可能最常见于用于对列表去重,它的最大特性是各元素仅保留1次,底层也是应用了哈希函数,所以在集合中查找元素一般也可实现O(1)复杂度,同时集合的嵌套元素也要求是不可变类型(可哈希对象)
add:在集合中增加一个元素,如果元素已存在,则无实际操作
pop:不接受任何参数,堪称是最神秘的操作,不同于列表的从尾端删除、字典的指定键删除,集合的pop操作看似是"随机"删除。但实际上是按照加入集合的先后顺序,删除"最早"加入的元素
除了与列表和字典中类似的增删改操作外,集合还支持数学概念下的集合操作,如交集、并集、差集等。
04、元组
如果说列表、字典和集合都有其各自擅长应用场景的话,那么元组可能是最没有存在感的数据结构:它接口有限、功能单一,而且是不可变类型。一般而言,用元组解决的问题都可以用列表实现。但使用用元组时,更多在于暗示该序列为不可变类型。当然,当元组内嵌套子列表时实际上是可以对嵌套的子列表进行更改操作的。
https://github.com/zqkyy/py_basic_structure
有问题可以私信我,欢迎交流!
F. 顺序结构、循环结构、分支结构的流程示意图
-------�����,-------��������,
|语句1|�����,|语句1|��������,
-------�����,-------����������,
�,|��������,|������������
�,V��������/�\����������
-------������/判定\�,NO�-------���
|语句2|������\��/�----,|语句3|��,
-------������,\�/����-------�,
���������YES|���������,
���������,-------��������,
���������,|语句2|��������,
���������,--------�������,
---------------
|语句1�,i,=,1|
---------------
�����,|
����,/�\
����/i<n,\�,NO���,-------
�|--->,\��/-----------|,exit,|
�|���\�/������,-------
�|���,|,YES����
�|�------------��
�---|语句2�i+1|
��,------------
G. python基础数据结构:序列、映射、集合
参考资料:http://www.cnblogs.com/jeffwongishandsome/archive/2012/08/05/2623660.html
Python中常见的数据结构可以统称为容器(container)。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要的容器。
一、序列(列表、元组和字符串)
序列中的每个元素都有自己的编号。Python中有6种内建的序列。其中列表和元组是最常见的类型。其他包括字符串、Unicode字符串、buffer对象和xrange对象。下面重点介绍下列表、元组和字符串。
1、列表
列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。
(1)、创建
通过下面的方式即可创建一个列表:
输出:
['hello', 'world']
[1, 2, 3]
可以看到,这中创建方式非常类似于javascript中的数组。
(2)、list函数
通过list函数(其实list是一种类型而不是函数)对字符串创建列表非常有效:
输出:
['h', 'e', 'l', 'l', 'o']
2、元组
元组与列表一样,也是一种序列,唯一不同的是元组不能被修改(字符串其实也有这种特点)。
(1) 、创建
输出:
(1, 2, 3) ('jeffreyzhao', 'cnblogs') (1, 2, 3, 4) () (1,)
从上面我们可以分析得出:
a、逗号分隔一些值,元组自动创建完成;
b、元组大部分时候是通过圆括号括起来的;
c、空元组可以用没有包含内容的圆括号来表示;
d、只含一个值的元组,必须加个逗号(,);
(2)、tuple函数
tuple函数和序列的list函数几乎一样:以一个序列(注意是序列)作为参数并把它转换为元组。如果参数就算元组,那么该参数就会原样返回:
输出:
(1, 2, 3)
('j', 'e', 'f', 'f')
(1, 2, 3)
Traceback (most recent call last):
File "F:\Python\test.py", line 7, in
t4=tuple(123)
TypeError: 'int' object is not iterable
3、字符串
(1)创建
输出:
Hello world
H
H
e
l
l
o
w
o
r
l
d
(2)、格式化
format():
print(‘{0} was {1} years old when he wrote this book’. format(name,age) )
print(‘{} was {} years old when he wrote this book’. format(name,age) )
print(‘{name} was {age} years old when he wrote this book’. format(name=’Lily’,age=’22’) )
#对于浮点数“0.333”保留小数点后三位
print(‘{0 : .3f}’.format(1.0/3) )
结果:0.333
#使用下划线填充文本,并保持文字处于中间位置
#使用^定义‘_____hello_____’字符串长度为11
print(‘{0 : ^_11}’.format(‘hello’) )
结果:_____hello_____
% :
格式化操作符的右操作数可以是任何东西,如果是元组或者映射类型(如字典),那么字符串格式化将会有所不同。
输出:
Hello,world
Hello,World
注意:如果需要转换的元组作为转换表达式的一部分存在,那么必须将它用圆括号括起来:
输出:
Traceback (most recent call last):
File "F:\Python\test.py", line 2, in
str1='%s,%s' % 'Hello','world'
TypeError: not enough arguments for format string
如果需要输出%这个特殊字符,毫无疑问,我们会想到转义,但是Python中正确的处理方式如下:
输出:100%
对数字进行格式化处理,通常需要控制输出的宽度和精度:
输出:
3.14
3.141593
3.14
字符串格式化还包含很多其他丰富的转换类型,可参考官方文档。
4、通用序列操作(方法)
从列表、元组以及字符串可以“抽象”出序列的一些公共通用方法(不是你想象中的CRUD),这些操作包括:索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员。除此之外,还有计算序列长度、最大最小元素等内置函数。
(1)索引
输出
H
2
345
索引从0(从左向右)开始,所有序列可通过这种方式进行索引。神奇的是,索引可以从最后一个位置(从右向左)开始,编号是-1:
输出:
o
3
123
(2)分片
分片操作用来访问一定范围内的元素。分片通过冒号相隔的两个索引来实现:
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4]
[6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[7, 8]
[7, 8, 9]
不同的步长,有不同的输出:
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8]
[0, 3, 6, 9]
[]
(3)序列相加
输出:
Hello world
[1, 2, 3, 2, 3, 4]
Traceback (most recent call last):
File "F:\Python\test.py", line 7, in
print str1+num1
TypeError: cannot concatenate 'str' and 'list' objects
(4)乘法
输出:
[None, None, None, None, None, None, None, None, None, None]
HelloHello
[1, 2, 1, 2]
Traceback (most recent call last):
File "F:\Python\test.py", line 5, in
print str1*num1
TypeError: can't multiply sequence by non-int of type 'list'
(5)成员资格
in运算符会用来检查一个对象是否为某个序列(或者其他类型)的成员(即元素):
输出:
False
True
True
(6)长度、最大最小值
通过内建函数len、max和min可以返回序列中所包含元素的数量、最大和最小元素。
输出:
5
o
H
5
123
1
二、映射(字典)
映射中的每个元素都有一个名字,如你所知,这个名字专业的名称叫键。字典(也叫散列表)是Python中唯一内建的映射类型。
1、键类型
字典的键可以是数字、字符串或者是元组,键必须唯一。在Python中,数字、字符串和元组都被设计成不可变类型,而常见的列表以及集合(set)都是可变的,所以列表和集合不能作为字典的键。键可以为任何不可变类型,这正是Python中的字典最强大的地方。
输出:
{1: 1}
Traceback (most recent call last):
File "F:\Python\test.py", line 6, in
d[list1]="Hello world."
TypeError: unhashable type: 'list'
2、自动添加
即使键在字典中并不存在,也可以为它分配一个值,这样字典就会建立新的项。
3、成员资格
表达式item in d(d为字典)查找的是键(containskey),而不是值(containsvalue)。
三、集合
集合(Set)在Python 2.3引入,通常使用较新版Python可直接创建,如下所示:
strs=set(['jeff','wong','cnblogs'])
nums=set(range(10))
看上去,集合就是由序列(或者其他可迭代的对象)构建的。集合的几个重要特点和方法如下:
1、副本是被忽略的
集合主要用于检查成员资格,因此副本是被忽略的,如下示例所示,输出的集合内容是一样的。
输出如下:
set([0, 1, 2, 3, 4, 5])
set([0, 1, 2, 3, 4, 5])
2、集合元素的顺序是随意的
这一点和字典非常像,可以简单理解集合为没有value的字典。
输出如下:
set(['wong', 'cnblogs', 'jeff'])
3、集合常用方法
a、并集union
输出:
set([1, 2, 3])
set([2, 3, 4])
set([1, 2, 3, 4])
union操作返回两个集合的并集,不改变原有集合。使用按位与(OR)运算符“|”可以得到一样的结果:
输出和上面union操作一模一样的结果。
其他常见操作包括&(交集),<=,>=,-,()等等,这里不再列举。
输出如下:
set([1, 2, 3])
set([2, 3, 4])
set([2, 3])
True
set([1, 2, 3])
False
b、add和remove
和序列添加和移除的方法非常类似,可参考官方文档:
输出:
set([1])
set([1, 2])
set([1])
set([1])
False
Traceback (most recent call last):
File "F:\Python\test.py", line 9, in
set1.remove(29) #移除不存在的项
KeyError: 29
4、frozenset
集合是可变的,所以不能用做字典的键。集合本身只能包含不可变值,所以也就不能包含其他集合:
输出如下:
Traceback (most recent call last):
File "F:\Python\test.py", line 3, in
set1.add(set2)
TypeError: unhashable type: 'set'
可以使用frozenset类型用于代表不可变(可散列)的集合:
输出:
set([1, frozenset([2])])