Python一些好玩的方法

好玩的小方法积累区, 可以跟我补充呀~


开头唠叨两句

有啥好玩的方法可以告诉我,积累一些小代码断

  • Author: Leo
  • Wechat: Leo-sunhailin
  • QQ: 379978424
  • E-mail: 379978424@qq.com

现在有12345五个东西,求分成2,3,4,5组的全排列总和,且每组每个方法不能重复。

1
2
3
4
# 320种
for i in range(2, 6):
for j in itertools.permutations('12345', i):
print([int(x) for x in j])

一般网页请求json数据返回的json到了Python中会变为字典形式,但是Python(3.6还是3.5之前)的字典是无序的,如果业务需求要有序的话,只要做如下修改:

1
2
3
4
5
6
7
8
from collection import OrderedDict

# url是目标地址
result = urllib.request.urlopen(url).read().decode("UTF-8")
# 主要就是object_pairs_hook这块引用OrderedDict.
json_result = json.loads(result, object_pairs_hook=OrderedDict)

# 这样返回的json字典就是有序的

如果你的MongoDB数据库中存了类似于这样的数据 LUUID(“e5e1c8ee-cb58-11e7-a088-f82819e1bcfa”), 实际上就UUID类型的数据,这时候改怎么读取回来之后查询呢?

官方文档: 官方文档

在讲如何查询之前先说明一下查询回来的结果只有 e5e1c8ee-cb58-11e7-a088-f82819e1bcfa 这一段,而且不能用

  • find({“xxx”: “e5e1c8ee-cb58-11e7-a088-f82819e1bcfa”})

或者

  • find({“xxx”: “LUUID(“e5e1c8ee-cb58-11e7-a088-f82819e1bcfa”)”})

结果都是无法查询到的

接下来先要明白的是MongoDB实际上存储的是一种叫做bson的类json数据格式(可以互换).所以方向有了接下来就是查询BSON里面对于UUID的定义了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 一般查全部返回的时候数据str类型的uuid,这时候无法直接回查,需要转换数据格式
# 引入两个包

from bson import UUIDLegacy
from bson.binary import UUID

# 例如你的uuid是e5e1c8ee-cb58-11e7-a088-f82819e1bcfa, 填进去返回的就是一个bson支持的UUID类型的数据
query = {"xxx": UUIDLegacy(UUID(<你的字符串类型的uuid>))}

# 如果你输出query就会发现会是下面这样子的
# {"xxx": UUIDLegacy('<你的UUID>')}

# 剩下就是查询语句而已了
conn = ...
db = conn[<表名>]
col = db[<集合名>]
col.find(query)
...


# 如果前提自己不会操作这些UUID的就在存储之前直接写入一个str的uuid。
# 我当时就没有意识到数据类型带来的问题,以为MongoDB会变成字符串.
# 不过这也有收获,知道bson还支持UUID这种数据类型

求两个List的差集和交集和并集

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 差集和交集基本上差不多.一般来说要求差和求交的情况都是两个长度不对应的时候
list_1 = [2, 7, 0, 1, 6, 5]
list_2 = [2, 7, 0]

# 差集(注意变量的位置, 长的在前,短的在后[说三遍])
# 这里随带说一句,网上很多使用set的difference的方法,但是那样会破坏顺序,所以还是推荐用列表推导式
diff_set = [i for i in list_1 if i not in list_2]

# 交集(谁先谁后无所谓)
public = [i for i in list_1 if i in list_2]

# 并集(用不了列表推导去写,判断逻辑有点多)
union = list(set(list_1).union(set(list_2)))

将一个列矩阵转换为对角矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 意思是这样的 [[1], [2], [3]] ==> [[1, 0, 0], [0, 2, 0], [0, 0, 3]]

if __name__ == '__main__':
def fill(data, pos, max_length):
if isinstance(data, list):
data = data[0]
a = [0] * (max_length - 1)
# a = []
# [a.insert(j, 0) for j in range(max_length - 1)]
a.insert(pos, data)
yield a

test = [1, 2, 3, 4]
res = [fill(d, i, max_length=len(test)).__next__() for i, d in enumerate(test)]
print(res)

斐波那契数列的简化写法

1
2
3
4
5
6
7
8
9
10
11
12

def fibonacci(a, b, max_value):
while True:
a, b = b, a+b
if max_value != (b > max_value and b or max_value):
break
yield b


if __name__ == '__main__':
res = [1, 1] + [num for num in fibonacci(a=1, b=1, max_value=10)]
print(res)

等分List(有奇偶处理逻辑)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

def i_split_by_n(ls, n):
for i in range(0, len(ls), n):
yield ls[i:i+n]


def split_by_n(ls, group):
"""
等分List(有奇偶处理逻辑)
逻辑: 将多出的部分和倒数第二组进行合并
:param ls: 需要等分的list
:param group: 组数
:return: 返回划分结果
"""
res = list(i_split_by_n(ls, int(len(ls) / group)))
if len(res) != group:
res = res[:-2] + [res[-2] + res[-1]]
return res

if __name__ == '__main__':
list_test = [x for x in range(1, 14)]
print(list_test)
print(split_by_n(ls=list_test, group=3))

# 原始list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
# 分组后(3组): [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12, 13]]
文章作者: sunhailin-Leo
文章链接: http://www.leoyuki.xyz/2017/12/10/PythonInterestMethods/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明来自 LeoBlog