第三讲|字符串、列表和栈

今天考了两门,哇简直啦,全部是背诵的题目,受不了了我赶紧来继续我的Python吧
这一章呢我要将的呢是数据结构:字符串、列表、元组、栈、队列、字典和集合

字符串

字符创可谓是编程语言里面的大哥呀,也是我们经常使用的一种形式

创建字符串
在Python里面我们只要给字符串赋值就可以了
srt1 = "hello world"
str2 = "ABCDEFHHFHJ"

访问字符串里面的元素
在Python里面可以通过向访问数组一样通过下标来访问字符串里面的某一个具体的元素,也可以一次访问多个字符串


例如:

str1 = "hello word"
print("srt1=",str1)
print("str1[0]=",str1[0])
print("str1[0:5]=",str1[0:5])
print("str1[4:9]=",str1[4:9])

执行结果:

srt1= hello word
str1[0]= h
str1[0:5]= hello
str1[4:9]= o wor

修改字符串:        
修改字符串使用内置方法replace(old,new)来实现,此外还可以进行字符串的拼接
str1 = “i am li hua”
str2 = "i am a student"
str1 = str1 + str2
print("str1= ",str1")
str1 = str1.replace(str2,"hello ")
print("str1=",str1)

执行结果

str1=  i am li hua i am a student
str1= i am li hua hello 

字符串运算符
字符串可以进行拼接,剪切,复值,成员运算等

str1 = "Hello world!"
str2 = "Jack"
#字符串拼接
print('str1+str2:',str1+str2)
#字符串截取
print('str1[0:6]:',str1[0:6])
#字符串复制
print('str2*2:',str2*3)
#成员运算:判断一个字符串是否包含某成员
print('world in str1?','world' in str1)
print('word in str1?','word' in str1)

执行结果:

str1+str2: Hello world!Jack
str1[0:6]: Hello
str2*2: JackJackJack
world in str1? True
word in str1? False

字符串格式化输出:
注意这里的写法可能还有看不懂的人,少为解释一下:%d这是在字符串里面用例外的数来代替,代替的内容为%后面的东西
#格式化为十进制:%d
print('PI is approximately equal to %d (I)'%(3.1415926))
#格式化字符串:%s
print('PI is approximately equal to %s (II)'%(3.1415926))
#格式化浮点数字,可指定小数点后的精度,默认为6位小数:%f
print('PI is approximately equal to %f (III)'%(3.1415926))
#格式化浮点数字,指定n位小数:%.nf
print('PI is approximately equal to %.2f (IV)'%(3.1415926))
#用科学计数法格式化浮点数:%e
print('PI is approximately equal to %e (V)'%(3.1415926))
#格式化为十进制:%d
print('The road is about %d meters long (VI)'%(1234))
#格式化无符号八进制数:%d
print('The road is about %o meters long (VII)'%(1234))
#格式化无符号十六进制数:%x
print('The road is about %x meters long (VIII)'%(1234))

执行结果:

PI is approximately equal to 3 (I)
PI is approximately equal to 3.1415926 (II)
PI is approximately equal to 3.141593 (III)
PI is approximately equal to 3.14 (IV)
PI is approximately equal to 3.141593e+00 (V)
The road is about 1234 meters long (VI)
The road is about 1234 meters long (VII)
The road is about 4d2 meters long (VIII)

字符串内建函数
Python提供了40余种内建函数,下面介绍几种
str1 = " Hello world! Hello"
str2 = "Hello"
#返回字符串的长度:len(str)
print('str1的长度:',len(str1))
#对字符串进行分割:split(str),分割符为str,此处以空格进行分割
print('str1以空格分割的结果:',str1.split(' '))
#删除字符串字符串首尾的空格
print('str1删除首尾空格:',str1.strip())
#count(str2, beg>=0,end<=len(str1))
#返回 str2 在 str1 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str2出现的次
print('str2在str1中出现的次数:',str1.count(str2))
print('str2在str1中出现的次数(指定范围):',str1.count(str2,10,20))
#检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束
#如果是,返回 True,否则返回 False.
print('str1是否以 str2结尾:',str1.endswith(str2))
print('str1是否以 str2结尾(指定范围):',str1.endswith(str2,10,19))
#检测 str2是否包含在字符串str1中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内
#如果包含返回开始的索引值,否则返回-1
print('str1中是否包含str2:',str1.find(str2))
print('str1中是否包含str2(指定范围):',str1.find(str2,10,20))

执行结果:

str1的长度: 19
str1以空格分割的结果: ['', 'Hello', 'world!', 'Hello']
str1删除首尾空格: Hello world! Hello
str2在str1中出现的次数: 2
str2在str1中出现的次数(指定范围): 1
str1是否以 str2结尾: True
str1是否以 str2结尾(指定范围): True
str1中是否包含str2: 1
str1中是否包含str2(指定范围): 14

列表
Python的最重要的数据结构之一列表。列表使用[]方括号括起来,并且以;结束
#随意创建3个列表,同一个列表中可以存放任意基本数据类型
list1 = [3.14, 5.96, 1897, 2020, "China",3+4j];
list2 = [1, 2, 3, 4, 5 ];
list3 = ["BeiJing", "ShangHai", "NanJing", "GuangZhou"];
list4 = []

如上所示,列表中的数据项可以是不同的数据类型,如 list1,同时包含浮点型、整型、
长整型、字符串和复数;也可以创建一个空列表,如 list4
访问列表中的元素
通过索引下标访问列表中的元素,可以一次访问一个或多个元素。

#通过索引下标访问列表中的单个元素
print("list1[2]: ",list1[2])
print("list2[2]: ",list2[2])
print("list3[2]: ",list3[2])
#通过索引下标一次访问多个元素
print("list1[0:2]:",list1[0:2])

执行结果:

list1[2]:  1897
list2[2]:  3
list3[2]:  NanJing
list1[0:2]: [3.14, 5.96]

更改列表中的元素

list1 = [3.14, 5.96, 1897, 2020, "China",3+4j];
print("before list1[3]: ",list1[4])
list1[4] = "Change"
print("after list1[3]: ",list1[4])

执行结果:

before list1[3]:  China
after list1[3]:  Change

删除列表中的元素
Python 提供三种删除列表中元素的方法:del、remove(obj)、clear(),分别用于删除列表中的元素和清空列表。
list1 = [3.14, 5.96, 1897, 2020, "China",3+4j];
print("Before the operation:",list1)
del list1[3]
list1.remove(3+4j)
print("After deleting the element:",list1)
list1.clear()
print("After the emptying of the list:",list1)

执行结果:

Before the operation: [3.14, 5.96, 1897, 2020, 'China', (3+4j)]
After deleting the element: [3.14, 5.96, 1897, 'China']
After the emptying of the list: []
向列表中添加新元素
有两个内建方法可以用于添加新元素:
1. append(object):添加新元素将新元素添加到列表末尾;
2. insert(index,object):插入新元素到指定索引位置
 
list1 = [3.14, 5.96, 1897, 2020, "China",3+4j];
print("before operation list1: ",list1)
list1.append("New Ele-I")
list1.insert(2, "New Ele-II")
print("after operation list1: ",list1)


执行结果:

before operation list1:  [3.14, 5.96, 1897, 2020, 'China', (3+4j)]
after operation list1:  [3.14, 5.96, 'New Ele-II', 1897, 2020, 'China', (3+4j), 'New Ele-I']

列表常用内建函数
上面介绍了关于列表的“增、删、改、查”基本操作,除此之外,Python 列表还有很多内
建函数和有趣的操作,接下来一一介绍。

list1 = [2012, 1949, 1897, 2050, 1945, 1949];
#求列表长度,即列表中元素的个数:len(obj)
print("The length of the list: ", len(list1))
#求列表中元素的最大值:max(list)
print("The largest element in the list: ", max(list1))
#求列表中元素的最小值:min(list)
print("The smallest element in the list: ", min(list1))
#统计某个元素在列表中出现的次数:list.count(obj)
print("The number of times 1949 appears: ", list1.count(1949))
#从列表中找出某个值第一个匹配项的索引位置:list.index(obj)
print("The index of the first location of 1949: ", list1.index(1949))
#复制一个已有的表:list.copy()
list2 = list1.copy()
print("list2:", list2)
#反转一个已有的表:list.reverse()
list1.reverse()
print("After reversing :", list1)

执行结果:

The length of the list:  6
The largest element in the list:  2050
The smallest element in the list:  1897
The number of times 1949 appears:  2
The index of the first location of 1949:  1
list2: [2012, 1949, 1897, 2050, 1945, 1949]
After reversing : [1949, 1945, 2050, 1897, 1949, 2012]

列表常用操作
为了高效的使用列表,Python 支持一些常用的操作:列表拼接、列表乘法、迭代、嵌套
等。

list1 = [1,2,3,4]
list2 = [5,6,"BeiJin",7,8]
#列表拼接
print("list1 + list2:",list1 + list2)
#列表乘法
print("list1*2:",list1*2)
#判断元素是否存在于列表中
print("3 in list1?",3 in list1)
print("100 in list1?",100 in list1)
#迭代
for element in list1:
print(element)
#列表嵌套
list3 = [list1, list2]
print("list3:", list3)

执行结果:

list1 + list2: [1, 2, 3, 4, 5, 6, 'BeiJin', 7, 8]
list1*2: [1, 2, 3, 4, 1, 2, 3, 4]
3 in list1? True
100 in list1? False
1 2 3 4
list3: [[1, 2, 3, 4], [5, 6, 'BeiJin', 7, 8]]


在上面“列表”小节中,我们介绍了列表,其中列表有两个内建函数:
1. append(obj):添加元素到列表尾部;
2. pop():从列表尾部取出元素。
不难理解,通过 append(obj) 函数最后添加的元素,可以通过 pop() 函数最先取出来,也
就是“后进先出”,这种数据结构称为“栈”。利用列表的两个内建方法,很容易实现“栈”这
种数据结构。

#初始化一个栈
stack1 = [1, 2, 3, 4, 5 ]
#向栈中添加元素
stack1.append(123)
print("stack1:",stack1)
#从栈中删除一个元素,及删除的是最后一个元素
print("stack1.pop():",stack1.pop())

执行结果:

stack1: [1, 2, 3, 4, 5, 123]
stack1.pop(): 123

好了,就到这里了,有许多不足之处还请见谅

顺便附上我的GitHub:https://github.com/Booboochen,点进去了,别忘了star奥

### 回答1: 可以使用顺序来实现该算法。具体步骤如下: 1. 遍历字符串str,找到@字符的位置,如果@字符不唯一,则不是合法字符串,直接返回false。 2. 将@字符之前的子串依次入。 3. 从@字符之后的位置开始遍历字符串str,依次将字符出,并与遍历到的字符比较,如果不相等,则不是合法字符串,直接返回false。 4. 如果遍历完整个字符串str,且为空,则是合法字符串,返回true;否则不是合法字符串,返回false。 下面是具体的代码实现: bool isValidString(string str) { int len = str.length(); int pos = -1; for (int i = 0; i < len; i++) { if (str[i] == '@') { if (pos != -1) return false; pos = i; } } if (pos == -1) return false; stack<char> s; for (int i = 0; i < pos; i++) { s.push(str[i]); } for (int i = pos + 1; i < len; i++) { if (s.empty() || s.top() != str[i]) { return false; } s.pop(); } return s.empty(); } ### 回答2: 题目分析: 本题需要设计一个算法来判断一个字符串是否为“序列1@序列2”形式字符串,其中序列2是序列1的逆序,并且在字符串str中恰好只有一个@字符。为了解决这个问题,可以考虑如下的算法步骤: 1. 创建一个空的顺序stack; 2. 依次读入字符串str中的每一个字符,判断其是否为@字符; 3. 如果遇到@字符,开始进行的操作,中的元素依次弹出,得到序列2; 4. 将剩余的字符依次压入中,得到序列1; 5. 判断序列1序列2是否相等,如果相等,说明该字符串为合法字符串,否则不是。 算法实现: 下面是一个具体的算法实现: ``` bool isValid(string str) { int len = str.length(); int mid = len / 2; int i = 0; char tmp; stack<char> stack1; stack<char> stack2; for (i = 0; i < mid; i++) { stack1.push(str[i]); // 将第一半字符入 } if (len % 2 != 0) i++; // 如果字符串长度为奇数,跳过@字符 for (; i < len; i++) { if (stack1.empty()) return false; // 如果为空,说明没有字符能够中的元素匹配 tmp = stack1.top(); stack1.pop(); // 弹出顶元素 if (str[i] != tmp) return false; // 判读当前字符顶元素是否匹配 } if (!stack1.empty()) return false; // 如果不为空,说明字符串中的字符数量不匹配 return true; } ``` 代码解释: * str.length()用于获取字符串str的长度; * mid用于计算字符串的中间位置,将字符串分成两半; * stack1stack2表示; * 将第一半的字符压入stack1中; * 将剩余的字符stack1中的字符逐个比较,如果匹配,则弹出stack1中的元素;如果不匹配,说明该字符串不是合法字符串; * 最后,判断stack1是否为空,如果不为空,说明字符串中的字符数量不匹配,不是合法字符串。 参考链接: 优快云博客:https://blog.youkuaiyun.com/zagdonkey/article/details/82737047?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162840666516780264159498%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=162840666516780264159498&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_default-5-82737047.pc_search_result_control_group&utm_term=用判断字符串是否为“序列1@序列2”&spm=1018.2226.3001.4187 Stack Overflow:https://stackoverflow.com/questions/40734397/check-if-given-string-is-of-form-sequence1-sequence2-in-c-using-stl-stack ### 回答3: 首先,根据题目要求,字符串str中应该恰好只有一个@字符。我们可以使用一个计数器,来记录@字符出现的次数,如果大于1或小于1则说明字符串不合法。 其次,我们需要使用顺序来判断序列1序列2是否为逆序关系。具体做法是,遍历字符串str,将@字符之前的字符逐个入,然后将@字符之后的字符逐个取出比较,如果与顶元素相同,则继续出比较,直到为空或不相同为止。如果为空,则说明序列1序列2为逆序关系。反之,如果非空,则说明序列1序列2不为逆序关系。 最后,我们需要判断整个字符串是否合法。具体做法是,判断@字符是否在第一个或最后一个位置,如果是,则字符串不合法。否则,进行第二步的操作,根据是否为空判断序列1序列2是否为逆序关系,如果不是,则字符串不合法;反之,则字符串合法。 综上所述,我们可以设计如下算法来判断字符串str是否为形如“序列1@序列2”的合法字符串: 1. 初始化计数器count=0,stack为空。 2. 遍历字符串str,如果字符为@,则count=count+1;否则,将字符入stack。 3. 如果count不等于1,则输出字符串不合法,结束算法。 4. 将stack中元素逐个取出,并与@字符之后的字符比较,如果相同,则继续取出比较,直到为空或不相同为止。 5. 如果为空,则说明序列1序列2为逆序关系;否则,说明序列1序列2不为逆序关系,输出字符串不合法,结束算法。 6. 如果@字符在第一个或最后一个位置,则输出字符串不合法,结束算法;否则,输出字符串合法,结束算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值