飞道的博客

[python] 一些有趣的语法

413人阅读  评论(0)


1. 关于列表的大坑

1.1 删除列表内特定的元素

方法1:存在元素删除法

每次执行存在运算,均从头到尾遍历列表查找,效率极低

ls = ["d", "d", "d", "2", "2", "d", "d", "4"]
s = "d"
while True:
	if s in ls:
		ls.remove(s)
	else:
		break
print(ls)
# ['2', '2', '4']

方法2:一次性遍历元素 删除法

ls = ["d", "d", "d", "2", "2", "d", "d", "4"]
for s in ls:
	if s == "d":
		ls.remove(s) # remove(s) 删除列表中第一次出现的该元素
print(ls)
# ['2', '2', 'd', 'd', '4']

大坑!!!正向索引的时候,某些元素可能会被跨过没访问到
为了弄清楚原理和过程,人为的给"d" 加了一个标签

ls = ["d1", "d2", "d3", "2", "2", "d4", "d5", "4"]

在 for s in ls 时,从索引 0 位置开始遍历,首先发现 ls[0] == “d”,因此删除ls[0]位置的"d"。

然后继续遍历,因为之前已经遍历完了’ls[0]'这个位置,因此继续遍历时跳过 ls[0],直接访问 ls[1],但其实此时的 ls 已经变了,ls[1] 实际是"d3"。不过,因为 ls[1] == “d”,因此执行remove,而remove删除的是列表中第一次出现的该元素,所以反而如愿的把"d2"删掉了。

然后继续遍历,这次直接到了 ls[2],此时的 ls=[“d3”, “2”, “2”, “d4”, “d5”, “4”],所以 ls[2] 是 “2”,继续遍历,发现 ls[3]==“d”,因此执行remove删掉了第一次作为"d"出现的"d3"。

然后继续遍历,到了 ls[4],此时的 ls=[“2”, “2”, “d4”, “d5”, “4”],所以ls[4]==“4”,不执行remove,遍历完毕。

解决办法:使用负向索引

ls = ["d", "d", "d", "2", "2", "d", "d", "4"]
for i in range(0, len(ls), -1):
	if ls[i] == "d":
		ls.remove(ls[i]) # remove(s) 删除列表中第一次出现的该元素
print(ls)
# ['2', '2', '4']

1.2 多维列表的创建

[ ] *5 的复制,实际上这5个小列表指向的都是同一个列表

2. 解析语法构造列表

2.1 基本结构

以列表为例,

[expression for value in iterable if condition]

三要素:表达式,可迭代对象,if 条件(可选)

执行过程:
1.从可迭代对象中拿出一个元素
2.通过 if 条件,对元素进行筛选
3.通过筛选的元素被传递给表达式,得到一个结果
4.将结果作为列表的一个元素进行存储
5.重复1-4,直到可迭代对象迭代结束,返回新列表

[expression for value in iterable if condition]
## 等价于
result = []
for value in iterable:
	if condition:
		result.append(expression)

2.2 列表解析的例子

【例1】求20以内的奇数的平方

squares = []
for i in range(1, 21):
	if i%2 == 1:
		squares.append(i**2)
print(squares)
# [1,9,25,49,81,121,169,225,289,361]
squares = [i**2 for i in range(1,21) if i%2 == 1]
print(squares)
# [1,9,25,49,81,121,169,225,289,361]

【例2】多变量

x = [1, 2, 3]
y = [1, 2, 3]
res = [i*j for i,j in zip(x,y)]
print(res)
# [1, 4, 9]

【例3】循环嵌套

colors = ["black", "white"]
sizes = ["s", "m", "l"]
tshirts = ["{} {}".format(col, siz) for col in colors for siz in sizes]
tshirts
# ['black s', 'black m', 'black l', 'white s', 'white m', 'white l']

3. 解析语法构造其他

3.1 构造字典

squares = {i: i**2 for i in range(5)}  ## 构造字典是大括号{}
for k, v in squares.items():
	print(k, ": ", v)
## 打印字典是键值对 k:v 
0: 0
1: 1
2: 4
3: 9
4: 16

3.2 构造集合

squares = {i**2 for i in range(5)}  ## 构造集合也是大括号{}
squares
## 打印集合还是大括号
{0, 1, 4, 9, 16}   

4. 条件表达式

expr1 if condition else expr2

n = -10
x = n if n>0 else -n
print(x)
## 10

相当于

n = -10
if n>0: x = n
else: x = -n
print(x)
## 10

转载:https://blog.csdn.net/weixin_43026262/article/details/105878409
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场