python 2x可以打么_Python奇技淫巧

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-22 22:17   65   0

总结的关于 Python 的一些魔法和技巧。原文链接(戳原文链接阅读体验更好):Python 奇技淫巧 - MurphyChen's Blogmphy.gitee.io

1. 处理输入

1.1 输入三个数字

map 方法返回的是可迭代对象,可以直接用三个变量接收。

# 输入:1 2 3

a, b, c = map(int, input().split())

1.2 输入一组数字

将 map 返回的对象用 list() 函数转换成列表,完成输入。

# 输入:1 2 3 4 5

nums = list(map(int, input().split()))

2. 将字符串打印出 n 次

n = 5

ch = "hello"

print(n * ch)

# 输出:hellohellohellohellohello

3. 合并字典的 5 种方法

3.1 update 方法

使用内置方法 update() 原地操作。

dct1.update(dtc2)

3.2 ** 解包

使用 ** 解包字典,之后直接用 dict() 或 {} 将其合并。

dct3 = {**dct1, **dct2}

3.3 items 合并

使用 items 方法将字典转成 dict_items 对象,然后取并集 |,最后可直接用 dict() 函数转成字典。

dct3 = dict(dct1.items() | dct2.items())

3.4 字典解析式

dct3 = {k:v for d in [dct1, dct2] for k, v in d.items()}

3.5 字典合并操作符

Python3.9 提供了合并操作符 |,可直接将两个字典合并。在此之前,| 运算符一般用于集合的求并运算。

dct3 = dct1 | dct2

原地操作

dct1 |= dct2

4. 合并列表的 5 种方法

4.1 直接相加

ls3 = ls1 + ls2

4.2 extend 方法

extend 方法是在列表末尾追加另一个序列中的所有元素。

ls1.extend(ls2)

4.3 * 解包大法

直接使用 ls3 = [ls1, ls2] 的方法会合成一个子序列的列表,可用 * 解包再合并。

ls3 = [*ls1, *ls2]

4.4 万能的列表推导式

是的,列表推导式也能用于合并列表。

ls3 = [i for ls in (ls1, ls2) for i in ls]

4.5 使用 heapq

heaqp 是 Python 内置的模块,heapq.merge 方法用于多个列表的合并,并将其堆排序。

import heapq

lst = heapq.merge(ls1, ls2, ls3)

5. 平铺多维列表

这里的多为维表就是指嵌套的列表,维度是指嵌套层数的最大值。比如二维列表 [1,[2,3],4],三维列表[1,[2,[3,4]],5] 等。

5.1 平铺二维列表

lst = [1, [2,3], [4, 5], 6]

def spread1(ls):

ans = []

for i in ls:

if isinstance(i, list):

ans.extend(i)

else:

ans.append(i)

return ans

spread1(lst)

# ans: [1, 2, 3, 4, 5, 6]

5.2 平铺任意维度列表

方法一(递归):很容易想到递归方法,实现如下。

lst = [1, [2, [3]], [[4, [5, 6]], 7], [8, 9], 10]

def spread2(lst, res=None):

if res is None:

res = []

for item in lst:

if isinstance(item, list):

spread2(item, res)

else:

res.append(item)

return res

spread(lst)

# res: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

方法二(迭代):递归易于理解,但是需要函数调用栈而降低效率,可以使用迭代(循环)代替。

def spred3(lst):

res = []

while lst:

head = lst.pop(0)

if isinstance(head, list):

lst = head + lst

else:

res.append(head)

return res

6. 将两个列表合并为字典

a = [1, 2, 3]

b = ['a', 'b', 'c']

dct = dict(zip(a,b))

# dtc = {1: 'a', 2: 'b', 3: 'c'}

7. 求列表中出现次数最多/少的元素

max 和 min 有一个参数 key,可指定求最大/小时的依据。

nums = [1,1,2,2,2,3]

max_freq = max(set(nums), key=nums.count)

min_freq = min(set(nums), key=nums.count)

8. 交换两个变量的值

原理是将 x 与 y 封装在一个元组内 (y, x),然后再按照位序赋值给 x,y。

x, y = y, x

9. 链式比较

对于 x >= 1 and x <= 10,我们可以简写为 1 <= x <= 10,这就是所谓的链式对比。 现在来看一个问题,试判断以下的真假?

True == True == False

是不是很难判断,但结合上述的链式比较,这个式子可以转化为:

True == True and True == False

现在结果一目了然了,返回值是 False。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP