Python技巧分享

大部分技巧在网上都能找到不少,这里列一些比较偏的了。

1.嵌套列表求和

ls = [('a',3),('b',10),('c',5),('d',2)]
print(sum(dict(ls).values()))   # 转字典即可.
# ==> 20

2.合并两个列表,并去重。

a = [1,2,3]
b = [3,4,5]
c = set().union(a,b)
# ==> c :{1,2,3,4,5}   # 再转list即可.

3.嵌套列表展平。

# 期望将:ls = [[1,2,3],[4,5,6],['a', 'b']]    转变为: [1, 2, 3, 4, 5, 6, 'a', 'b']
ls = [[1,2,3],[4,5,6],['a', 'b']] 
# 通过sum函数可以将2层的嵌套列表进行展平。
ls2 = sum(ls,[])
# ls2 ==> [1, 2, 3, 4, 5, 6, 'a', 'b']

#类似的,元组也有该功能。
t1 = ((1,2,3),(4,5,6),(7,))
sum(t1,()) 
==>(1,2,3,4,5,6,7)

4.多层嵌套列表的展平。

sum只能展开一层,如果要展开多层,需要多次展开。
在这里插入图片描述

而且,如果层级不相同,展到某层完全展开之后,就会报错了。
在这里插入图片描述
因此,若要展开多层,且层级各不一样的嵌套列表,则需要借助一些库,深度展平的库 deepflatten。
这是一个第三方库,需要下载安装。

但是需要注意:pip install iteration_utilities 高版本python安装时会报错,我使用的3.10.5无法安装。因为这个功能也不常用,也不去解决了。

from iteration_utilities import deepflatten
# 仅仅嵌套列表.
ls = [[1,2,3],[4,5,[6,7]],[8,[9,[10,[11,12]]]]]
new_ls = list(deepflatten(ls))
print(new_ls)
==>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

# 嵌套元组,也能给你展平了.
ls = [[1,2,3],(2,3,[4,5,(6,(7,8))]),[8,[9,[10,[11,12]]]]]
new_ls = list(deepflatten(ls))
print(new_ls)
==>[1, 2, 3, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12]

5.查找字符/串是否在目标字符串内,并返回子串开始的索引。

ss = 'hello world'
# 查找world是否在ss内,并返回索引。
ss.find('world')6

6.字典根据键或值进行排序

思路:
1.排序使用内置函数sorted。
2.将每个键值对捆绑在一起,循环遍历。

dd = {'c':5,'a':3,'e':2,'d':6,'b':1,'f':4}
# 根据键值排序
# 参数解释:必要传一个迭代器,这里传入的是dd.items(),就是将每一个键值对组成一个元组,后面的key传入一个匿名函数,匿名函数针对每一个元组进行判断,x[0],就是键。x[1]是值。 因为:dd.items() 拿到的单个元组是这样的:('c',5)。
res = sorted(dd.items(),key=lambda x:x[0])  # sorted的返回值就是结果,在执行器里,也会直接打印结果。初学那会,我记得好像是没有返回值的。现在有了,也不错。
# ==> [('a', 3), ('b', 1), ('c', 5), ('d', 6), ('e', 2), ('f', 4)]

# 根据值进行排序
res2 = sorted(dd.items(),key=lambda x:x[1])
#  ==> [('b', 1), ('e', 2), ('a', 3), ('f', 4), ('c', 5), ('d', 6)]

# sorted还有个可选参数,reverse,可以选择排序方式,默认是升序的(False),设置为Ture。结果如下:
res = sorted(dd.items(),key=lambda x:x[1],reverse=True)
# ==> [('d', 6), ('c', 5), ('f', 4), ('a', 3), ('e', 2), ('b', 1)]

7.字典嵌套多个同类型的子字典,循环取值。

源于看到知乎上一个提问,记录一下。直接看代码截图了。这里还是匿名函数和map函数的组合使用。感觉很方便。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值