从Python看C语⾔(列表字典篇)
本篇博客来聊⼀下列表和字典,⼤致对应C语⾔中的数组与结构体,但它们之间语法规则仍有不少区别,不禁感慨,Python真是个好东西,唉,少年不知勤学早,⽩⾸⽅悔学Python迟~π__π
Part 1.⼀维列表
列表与数组有什么区别呢?如果C/C++的数组是纯净物的话,那么Python的列表就是混合物(PS:化学警告)。数组只能装有统⼀数据类型的元素,因此,有int、char、double、float型数组之分;⽽列表却可以装有不同数据类型的元素。对于数组下标,C/ C++和Python 都不允许除int型以外的数据作为下标,但C语⾔数组的下标>=0,Python的下标在遵循以0为⾸元素下标的规则条件下,还允许负数作为下标,如下图所⽰:
Python的列表可以理解为⼀种环状的结构,⾸尾相接,0是⾸位元素下标,-1则是⾸元素上⼀位元素的下标,即倒数第⼀位元素的下标,-2则是倒数第⼆位元素的下标,以此类推。然⽽,即使是⼀个环状,数组下标的范围也只限⼀圈的循环,⽐如上⾯定义的array数组,只有3个元素,-1是末位元素2.5的下标,
那么再加⼀圈,-4可不可以是2元素2.5的下标呢?答案是不⾏,-4已超出列表元素下标的范围,同样,我们也知道,array[3]也是不成⽴的。
想要删除数组中的⼀个值,并让其之后的元素都往前移⼀位,数组⼤⼩也减去1,该怎么办呢?想要在数组中插⼊⼀个值,数组⼤⼩增加1,⼜该怎么办?C++提供了vector动态数组,可以解决这种问题,⽐如对于数组{1,2,3,4,5},我想把数组中的第四个元素删去(元素下标为3),然后在数组⾸位元素前插⼊int型元素9,可以使⽤vector的⽅法:
#include<iostream>
#include<vector>
using namespace std;
const int N=5;
int A[N]={1,2,3,4,5};
vector<int>vec(A,A+N);//声明并⽤A数组元素初始化vec向量
int main(){
for(int i=0;i<vec.size();i++)//vector数组⼤⼩会根据删减元素的情况⽽改变
cout<<vec[i]<<' ';
vec.insert(vec.begin(),9);//在vec数组⾸元素前插⼊元素9
cout<<endl;
for(int i=0;i<vec.size();i++)
cout<<vec[i]<<' ';
return 0;
}
⽽对于Python的列表,我们可以直接使⽤del删除数组元素,并通过简单的加减号字符衔接被插⼊的元素与原有元素:
当然,还有更快的⽅法,类似于vector中的insert,Python也可以使⽤insert()函数插⼊元素。真是⽅便快捷~
除了使⽤for循环以外,我们还可以使⽤⼀种⽅法,快速地筛出列表中⼀组连续的元素:
0:3的范围就是数组第0个元素到数组第3个元素之前⼀位的元素,即A[0]~A[2];同理3:5的范围就是A[3]~A[4]。负数下标也是可以的哟:
值得注意的是,范围区间是有⽅向性的,即左边界数字<=右边界数字,这跟⾼中数学坐标轴上区间的书写规范是类似的。另外,范围区间不能同时混有正数和负数下标,否则运⾏结果如下:
Python的列表功能很多,排序是其中⼀个重要功能:
对于数字,由⼩到⼤排序;对于字符,使⽤“ASCII字符排序”,这意味着⼤写字母会排在⼩写字母之前。
虽然数字、字符均可以按照以上规律排序,但不能将字符与数字混合排序:
Part 2.⼆维列表
⼆维列表与⼆维数组结构类似,在此基础上也拥有上述⼀维列表”混合物“的性质,Python给列表赋予许多简便操作的同时,也带来了不少“陷阱”,需要我们注意。
删除⼀维列表元素的⽅法前⾯已经讲述,那么,我们引⽤len()函数检验⼀下删除⼀个元素后,⼀维列表长度的变化:
在删除⼆位列表元素时,其长度的变化:
在这⾥,我们可以看出,⼆位列表的长度就是它的⾏数,⽽⾮其元素总数,删除掉某⼀⾏的其中⼀个元素,并不会对长度造成影响。那如果我们将同⼀⾏的所有元素删去,就能删除该⾏,减⼩列表长度了吗?
⾸先看⼀下刚才被删的元素所在位置C[1][0]的值:
可见该位置已被C[1][1]的元素给补上了,⽽C[1][1]现在已不再属于⼆维列表了:
那么,把现有的C[1][0]元素给删除,⼆维列表的长度会变成1吗?
当然不是,为什么呢?不如我们看看C的第1⾏C[1]现在长什么样吧:
原来,把⼆维列表看作⼀栋房⼦,删除该⾏的元素相当于搬⾛房⼦某个楼层的家具,即使把整个楼层的家具都搬了,楼层的壳还在呀,房⼦的楼层数不会变。只有把该层楼给拆了,才会减⼩房⼦的层数,即⼆维列表的长度才会减⼩:
Part 3.字典与结构化数据
在C语⾔中,如果我们需要创建⼀个名为student的结构体,⾥⾯包含姓名、年龄两个成员,那么我们可以这么写:
#include<stdio.h>
#include<string.h>
编程先学c语言还是python#include<stdlib.h>
struct Student{
char name[20];
int age;
}student;
int main(){
memcpy(student.name,"JOHN",sizeof(char)*20);
student.age=17;
printf("%s-%d",student.name,student.age);
return 0;
}
类似于C语⾔的结构体,我们可以这么定义Python中的字典:
在这⾥,‘name'、'age'叫做字典的”键“,⽽‘JOHN’、17叫做字典的值,”键"和“值”分别对应函数keys()和values(),这两个函数可以将它们输出,⽽items()函数会输出“键-值”。
最后,感谢耐⼼观看,如有错误,欢迎指正。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论