容器数据类型
[元素1, 元素2, ..., 元素n]
。[]
和,
x = [2, 3, 4, 5, 6, 7]
print(x, type(x))
# [2, 3, 4, 5, 6, 7]
range()
创建列表x = list(range(1, 11, 2))
print(x, type(x))
# [1, 3, 5, 7, 9]
x = [0] * 5
print(x, type(x))
# [0, 0, 0, 0, 0]
x = [0 for i in range(5)]
print(x, type(x))
# [0, 0, 0, 0, 0]
x = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 0, 0]]
print(x, type(x))
# [[1, 2, 3], [4, 5, 6], [7, 8, 9], [0, 0, 0]]
x = [[0] * 3 for row in range(4)]
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
注意:
由于list的元素可以是任何对象,因此列表中所保存的是对象的指针。即使保存一个简单的[1,2,3]
,也有3个指针和3个整数对象。
x = [a] * 4
操作中,只是创建4个指向list的引用,所以一旦a
改变,x
中4个a
也会随之改变。
mix = [1, 'lsgo', 3.14, [1, 2, 3]]
print(mix) # [1, 'lsgo', 3.14, [1, 2, 3]]
empty = []
print(empty) # []
列表不像元组,列表内容可更改 (mutable),因此附加 (append
, extend
)、插入 (insert
)、删除 (remove
, pop
) 这些操作都可以用在它身上。
list.append(obj)
在列表末尾添加新的对象,只接受一个参数,参数可以是任何数据类型,被追加的元素在 list 中保持着原结构类型。list.extend(seq)
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)append与extend区别:
a = [0, 1, 2, 3]
b = [4, 5]
a.append(b) # [0, 1, 2, 3, [4, 5]]
a.extend(b) # [0, 1, 2, 3, 4, 5]
list.insert(index, obj)
在编号 index
位置前插入 obj
。list.remove(obj)
移除列表中某个值的第一个匹配项list.pop([index=-1])
移除列表中的一个元素(默认最后一个元素),并且返回该元素的值x = ['1', '2', '3', '4', '5']
y = x.pop() # 5
y = x.pop(0) # 1
del var1[, var2 ……]
删除单个或多个对象。x = ['1', '2', '3', '4', '5']
del x[0:2]
print(x) # ['3', '4', '5']
列表切片:
start
step
为 1 (默认) 从编号 start
往列表尾部切片。x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(x[3:]) # ['Thursday', 'Friday']
print(x[-3:]) # ['Wednesday', 'Thursday', 'Friday']
stop
step
为 1 (默认) 从列表头部往编号 stop
切片。week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[:3]) # ['Monday', 'Tuesday', 'Wednesday']
print(week[:-3]) # ['Monday', 'Tuesday']
start : stop
step
为 1 (默认) 从编号 start
往编号 stop
切片。week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[1:3]) # ['Tuesday', 'Wednesday']
print(week[-3:-1]) # ['Wednesday', 'Thursday']
start : stop : step
step
从编号 start
往编号 stop
切片。注意最后把 step
设为 -1,相当于将列表反向排列。week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
print(week[1:4:2])
# ['Tuesday', 'Thursday']
print(week[:4:2])
# ['Monday', 'Wednesday']
print(week[1::2])
# ['Tuesday', 'Thursday']
print(week[::-1])
# ['Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday']
:
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
list1 = [123, 456, 789, 213]
list2 = list1
list3 = list1[:]
print(list2) # [123, 456, 789, 213]
print(list3) # [123, 456, 789, 213]
list1.sort()
print(list2) # [123, 213, 456, 789]
print(list3) # [123, 456, 789, 213]
list1 = [[123, 456], [789, 213]]
list2 = list1
list3 = list1[:]
print(list2) # [[123, 456], [789, 213]]
print(list3) # [[123, 456], [789, 213]]
list1[0][0] = 111
print(list2) # [[111, 456], [789, 213]]
print(list3) # [[111, 456], [789, 213]]
==
+
*
in
、not in
==
,只有成员、成员位置都相同时才返回True。
和元组拼接一样, 列表拼接也有两种方式,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。
【例子】
list1 = [123, 456]
list2 = [456, 123]
list3 = [123, 456]
print(list1 == list2) # False
print(list1 == list3) # True
list4 = list1 + list2 # extend()
print(list4) # [123, 456, 456, 123]
list5 = list3 * 3
print(list5) # [123, 456, 123, 456, 123, 456]
list3 *= 3
print(list3) # [123, 456, 123, 456, 123, 456]
print(123 in list3) # True
print(456 not in list3) # False
之前三种方法(append
, extend
, insert
)可对列表增加元素,它们没有返回值,是直接修改了原数据对象。
将两个list相加,需要创建新的 list 对象,从而需要消耗额外的内存,特别是当 list 较大时,尽量不要使用 “+” 来添加list。
list.count(obj)
统计某个元素在列表中出现的次数list1 = [123, 456] * 3 # [123, 456, 123, 456, 123, 456]
num = list1.count(123) # 3
list.index(x[, start[, end]])
从列表中找出某个值第一个匹配项的索引位置list1 = [123, 456] * 5
list1.index(123) # 0
list1.index(123, 1) # 2
list1.index(123, 3, 7) # 4
list.reverse()
反向列表中元素x = [123, 456, 789]
x.reverse() # [789, 456, 123]
list.sort(key=None, reverse=False)
对原列表进行排序。key
– 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。reverse
– 排序规则,reverse = True
降序, reverse = False
升序(默认)。x = [123, 456, 789, 213]
x.sort() # [123, 213, 456, 789]
x.sort(reverse=True) # [789, 456, 213, 123]
1、列表操作练习
列表lst 内容如下
lst = [2, 5, 6, 7, 8, 9, 2, 9, 9]
请写程序完成下列操作:
lst.extend(15)
lst.insert(len(lst)/2,20)
lst += [2,5,6]
lst.pop(3)
lst.reverse()
lst.sort(reverse=False)
lst.sort(reverse=True)
2、修改列表
问题描述:
lst = [1, [4, 6], True]
请将列表里所有数字修改成原来的两倍
def DoubleNum(lst):
for index, value in enumerate(lst):
if isinstance(value, bool):
pass
elif isinstance(value, int):
lst[index] *= 2
elif isinstance(value, list):
DoubleNum(value)
else:
pass
lst = [1, [4, 6], True]
DoubleNum(lst)
print(lst)
3、山脉数组的峰顶索引
如果一个数组k符合下面两个属性,则称之为山脉数组
数组的长度大于等于3
存在 i i i, i i i >0 且 i < len ( k ) − 1 i<\operatorname{len}(k)-1 i<len(k)−1, 使得 k [ 0 ] < k [ 1 ] < … < k [ i − 1 ] < k [ i ] > k [ i + 1 ] … > k [ len ( k ) − 1 ] \mathrm{k}[0]<\mathrm{k}[1]<\ldots<\mathrm{k}[\mathrm{i}-1]<\mathrm{k}[\mathrm{i}]>\mathrm{k}[\mathrm{i}+1] \ldots>\mathrm{k}[\operatorname{len}(\mathrm{k})-1] k[0]<k[1]<…<k[i−1]<k[i]>k[i+1]…>k[len(k)−1]
这个 i i i就是顶峰索引。
现在,给定一个山脉数组,求顶峰索引。
示例:
输入:[1, 3, 4, 5, 3]
输出:3
class Solution:
def peakIndexInMountainArray(self, A: List[int]) -> int:
return A.index(max(A))
「元组」定义语法为:(元素1, 元素2, ..., 元素n)
t1 = (1, 10.31, 'python')
t2 = 1, 10.31, 'python'
print(t1, type(t1))
# (1, 10.31, 'python')
print(t2, type(t2))
# (1, 10.31, 'python')
tuple1 = (1, 2, 3, 4, 5, 6, 7, 8)
tuple1[1] # 2
tuple1[5:] # (6, 7, 8)
tuple1[:5] # (1, 2, 3, 4, 5)
tuple2 = tuple1[:] # (1, 2, 3, 4, 5, 6, 7, 8)
temp = (1)
type(temp) #
temp = 2, 3, 4, 5
type(temp) #
temp = []
type(temp) #
temp = ()
type(temp) #
temp = (1,)
type(temp) #
8 * (8) # 64
8 * (8,) # (8, 8, 8, 8, 8, 8, 8, 8)
也可以创建二维元组:
nested = (1, 10.31, 'python'), ('data', 11)
print(nested)
# ((1, 10.31, 'python'), ('data', 11))
元组中可以用整数来对它进行索引 (indexing) 和切片 (slicing),不严谨的讲,前者是获取单个元素,后者是获取一组元素。
nested[0]
# (1, 10.31, 'python')
nested[0][0], nested[0][1], nested[0][2]
# 1 10.31 python
切片
print(nested[0][0:2])
# (1, 10.31)
week = ('Monday', 'Tuesday', 'Thursday', 'Friday')
week = week[:2] + ('Wednesday',) + week[2:]
# ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')
t1 = (1, 2, 3, [4, 5, 6])
print(t1) # (1, 2, 3, [4, 5, 6])
t1[3][0] = 9
print(t1) # (1, 2, 3, [9, 5, 6])
元组有不可更改 (immutable) 的性质,因此不能直接给元组的元素赋值,但是只要元组中的元素可更改 (mutable),那么我们可以直接更改其元素,注意这跟赋值其元素不同。
+
*
in
、not in
元组拼接 (concatenate) 有两种方式,用+
和*
,前者首尾拼接,后者复制拼接。
t1 = (1, 2, 3)
t2 = (4, 5)
t3 = t1 + t2
# (1, 2, 3, 4, 5)
t4 = t2 * 2
# (4, 5, 4, 5)
元组大小和内容都不可更改,因此只有 count
和 index
两种方法。
t = (1, 10.31, 'python')
print(t.count('python')) # 1
print(t.index(10.31)) # 1
count('python')
是记录在元组 t
中该元素出现几次,显然是 1 次index(10.31)
是找到该元素在元组 t
的索引,显然是 1t = (1, 10.31, 'python')
(a, b, c) = t
print(a, b, c)
# 1 10.31 python
t = (1, 10.31, ('OK', 'python'))
(a, b, (c, d)) = t
print(a, b, c, d)
# 1 10.31 OK python
*
,英文叫 wildcard,在计算机语言中代表一个或多个元素。下例就是把多个元素丢给了 rest
变量。t = 1, 2, 3, 4, 5
a, b, *rest, c = t
print(a, b, c) # 1 2 5
print(rest) # [3, 4]
如果你根本不在乎 rest 变量,那么就用通配符*
加上下划线_
。
a, b, *_ = t
print(a, b) # 1 2
1、元组概念
写出下面代码的执行结果和最终结果的类型
(1, 2)*2
(1, )*2
(1)*2
(1, 2, 1, 2) <class, 'tuple'>
(1, 1) <class, 'tuple'>
2 <class 'int'>
分析为什么会出现这样的结果?
答:前两个是元组,*2
运算使其重复两次;第三个"(1)"括号内元素无,
隔开,被当做为单元素类型int
2、拆包过程是什么?
答:拆包过程是指用一条赋值语句将元组当中每个元素分别赋值给指定变量。
a, b = 1, 2
上述过程属于拆包吗?
答:属于。"1, 2"定义了一个元组,上述符合拆包
可迭代对象拆包时,怎么赋值给占位符?
答:设置变量如rest
,在其之前加上通配符*
匹配一个或多个变量。
t1 = 'i love Python!'
print(t1, type(t1))
# i love Python!
t2 = "I love Python!"
print(t2, type(t2))
# I love Python!
print(5 + 8) # 13
print('5' + '8') # 58
'
或双引号"
,可以使用转义符号\
对字符串中的符号进行转义。print('let\'s go') # let's go
print("let's go") # let's go
print('C:\\now') # C:\now
转义字符 | 描述 |
---|---|
\\ |
反斜杠符号\ |
\' |
单引号' |
\" |
双引号" |
\n |
换行 |
\t |
横向制表符(TAB) |
\r |
回车 |
print(r'C:\Program Files\Intel\Wifi\Help')
# C:\Program Files\Intel\Wifi\Help
para_str = """这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( \t )。
也可以使用换行符 [ \n ]。
"""
print (para_str)
'''
这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( )。
也可以使用换行符 [
]。
'''
start:end
这种形式,包括start
索引对应的元素,不包括end
索引对应的元素。s1 = 'Hello World!'
print(s1[:5]) # Hello
print(s1[4]) # o
print(s1[:6] + " 插入的字符串 " + str[5:])
# Hello 插入的字符串 World!
s2 = 'Python'
print(s2) # Python
print(s2[2:4]) # th
print(s2[-5:-2]) # yth
print(s2[2]) # t
print(s2[-1]) # n
capitalize()
将字符串的第一个字符转换为大写。s = 'python'
print(s.capitalize()) # Python
lower()
转换字符串中所有大写字符为小写。upper()
转换字符串中的小写字母为大写。swapcase()
将字符串中大写转换为小写,小写转换为大写。s = "Python"
print(s.lower()) # python
print(s.upper()) # PYTHON
print(s.swapcase()) # pTHON
count(str, beg= 0,end=len(string))
返回str
在 string 里面出现的次数,如果beg
或者end
指定则返回指定范围内str
出现的次数。s = "Hello World"
print(s.count('o')) # 2
endswith(suffix, beg=0, end=len(string))
检查字符串是否以指定子字符串 suffix
结束,如果是,返回 True,否则返回 False。如果 beg
和 end
指定值,则在指定范围内检查。startswith(substr, beg=0,end=len(string))
检查字符串是否以指定子字符串 substr
开头,如果是,返回 True,否则返回 False。如果 beg
和 end
指定值,则在指定范围内检查。s = "Python"
print(s.endswith('on')) # True
print(s.endswith('in')) # False
print(s.startswith('py')) # False
print(s.startswith('Py')) # True
find(str, beg=0, end=len(string))
检测 str
是否包含在字符串中,如果指定范围 beg
和 end
,则检查是否包含在指定范围内,如果包含,返回开始的索引值,否则返回 -1。rfind(str, beg=0,end=len(string))
类似于 find()
函数,不过是从右边开始查找。s = "Hello World"
print(s.find('o')) # 4
print(s.find('hello')) # -1
print(s.rfind('o')) # 7
isnumeric()
如果字符串中只包含数字字符,则返回 True,否则返回 False。s1 = '12345'
print(s1.isnumeric()) # True
s2 += 'a'
print(s2.isnumeric()) # False
ljust(width[, fillchar])
返回一个原字符串左对齐,并使用fillchar
(默认空格)填充至长度width
的新字符串。rjust(width[, fillchar])
返回一个原字符串右对齐,并使用fillchar
(默认空格)填充至长度width
的新字符串。s = '1101'
print(s.ljust(8, '0')) # 11010000
print(s.rjust(8, '0')) # 00001101
lstrip([chars])
截掉字符串左边的空格或指定字符。rstrip([chars])
删除字符串末尾的空格或指定字符。strip([chars])
在字符串上执行lstrip()
和rstrip()
。s = ' Hello World '
print(s.lstrip()) # 'Hello World '
print(s.strip()) # 'Hello World'
print(s.rstrip()) # ' Hello World'
partition(sub)
找到子字符串sub,把字符串分为一个三元组(pre_sub,sub,fol_sub)
,如果字符串中不包含sub则返回('原字符串','','')
。rpartition(sub)
类似于partition()
方法,不过是从右边开始查找。s = 'Hello World'
print(s.partition('o')) # ('Hell', 'o', ' World')
print(s.partition('x')) # ('Hello World', '', '')
print(s.rpartition('o')) # ('Hello W', 'o', 'rld')
replace(old, new [, max])
把 将字符串中的old
替换成new
,如果max
指定,则替换不超过max
次。s = 'Hello World'
print(s.replace('Hello', 'Goodbye')) # Goodbye World
split(str="", num)
不带参数默认是以空格为分隔符切片字符串,如果num
参数有设置,则仅分隔num
个子字符串,返回切片后的子字符串拼接的列表。s = 'Hello World'
print(s.split()) # ['Hello', 'World']
print(s.split('o')) # ['Hell', ' W', 'rld']
# 分割0次
print(s.split("o", 0)) # ['Hello World']
# 分割1次
print(s.split("o", 1)) # ['Hello', 'World']
去掉换行符等特殊字符
s = '''Hello
world'''
print(s.split('\n')) # ['Hello', 'World']
splitlines([keepends])
按照行(’\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数keepends
为 False,不包含换行符,如果为 True,则保留换行符。s = 'Hello \n World'
'''
Hello
World
'''
print(s.splitlines()) # ['Hello ', ' World']
print(s.splitlines(True)) # ['Hello \n', ' World']
maketrans(intab, outtab)
创建字符映射的转换表,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。translate(table, deletechars="")
根据参数table
给出的表,转换字符串的字符,要过滤掉的字符放到deletechars
参数中。s = 'this is string example....wow!!!'
intab = 'aeiou'
outtab = '12345'
trantab = s.maketrans(intab, outtab)
print(trantab) # {97: 49, 111: 52, 117: 53, 101: 50, 105: 51}
print(s.translate(trantab)) # th3s 3s str3ng 2x1mpl2....w4w!!!
format
格式化函数s1 = "{0} Love {1}".format('I', 'Python') # 位置参数
print(s1) # I Love Python
s2 = "{a} Love {b}".format(a='I', b='Python') # 关键字参数
print(s2) # I Love Python
s3 = "{0} Love {b}".format('I', b='Python') # 位置参数要在关键字参数之前
print(s3) # I Love Python
s4 = '{0:.2f}{1}'.format(27.658, 'GB') # 保留小数点后两位
print(s4) # 27.66GB
符 号 | 描述 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串,用str()方法处理对象 |
%r | 格式化字符串,用rper()方法处理对象 |
%d | 格式化整数 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | 根据值的大小决定使用%f或%e |
%G | 作用同%g,根据值的大小决定使用%f或%E |
print('%c' % 97) # a
print('%c %c %c' % (97, 98, 99)) # a b c
print('%d + %d = %d' % (4, 5, 9)) # 4 + 5 = 9
print("我叫 %s 今年 %d 岁!" % ('小明', 10)) # 我叫 小明 今年 10 岁!
print('%o' % 10) # 12
print('%x' % 10) # a
print('%X' % 10) # A
print('%f' % 27.658) # 27.658000
print('%e' % 27.658) # 2.765800e+01
print('%E' % 27.658) # 2.765800E+01
print('%g' % 27.658) # 27.658
text = "I am %d years old." % 22
print("I said: %s." % text) # I said: I am 22 years old..
print("I said: %r." % text) # I said: 'I am 22 years old.'
符号 | 功能 |
---|---|
m.n | m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
- | 用做左对齐 |
+ | 在正数前面显示加号( + ) |
# | 在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’) |
0 | 显示的数字前面填充’0’而不是默认的空格 |
print('%5.1f' % 27.658) # ' 27.7'
print('%.2e' % 27.658) # 2.77e+01
print('%10d' % 10) # ' 10'
print('%-10d' % 10) # '10 '
print('%+d' % 10) # +10
print('%#o' % 10) # 0o12
print('%#x' % 108) # 0x6c
print('%010d' % 5) # 0000000005
1、字符串函数回顾
replace
函数将指定子字符串替换split
函数,不带参数默认按照空格拆分lstrip
函数去除字符串最左侧即首位字符,不带参数默认为空格2、实现isDigit函数
题目要求
实现函数isDigit, 判断字符串里是否只包含数字0~9
def isDigit(string):
"""
判断字符串只包含数字
:param string:
:return:
"""
return string.isnumeric()
3、最长回文子串
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例:
输入: “babad”
输出: “bab”
输入: “cbbd”
输出: “bb”
class Solution:
def longestPalindrome(self, s: str) :
l = 1
palindrome = []
for i in range(len(s)):
for j in range(i,len(s)):
t = s[i:j+1]
if t == t[::-1]:
if len(t)>l:
l = len(t)
palindrome = [t]
elif len(t)==l:
palindrome.append(t)
for p in palindrome:
print(p)