Python3 From Zero——{最初的意识:数据结构和算法}

一、从队列两端高效插入、删除元素,及保留固定数量的数据条目:

collections.deque([iterable[,maxlen=N]])

a = collections.deque([1, 2],maxlen=3)

a.appendleft(3)

[3, 1, 2]

a.appendleft(4)

[4, 3, 1]

a.popleft()

[3, 1]

二、求队列中最大或最小的N个元素

思路1:heapq.nlargest(N, iterable, key=None)、heapq.nsmallest(N, iterable, key=xxx)

思路2:先排序,再切片:sorted(items)[:N]、sorted(items)[-N:]

如果对象是一个字典,则可以先用zip将字典的key、value反转形成包含元组的列表,如:min_xxx = min(zip(dict.values(), dict.key()))

三、实现自定义优先级队列

heapq.heappush(heap, item),item表示自定义的优先级标识,可以为元组、列表等,用以实现多级联排

heapq.heappop(heap),剔除并显示综合优先级最小的元素

四、字典的key、key-value支持常见的集合操作(value不支持),如并集(&)、交集(|)、差集(单向-,双向^)等,无须事先转换为集合,可用于比较两个字典之间keys或items的异同、重叠等,如:a.keys() - b.keys(),a.items() & b.items()

五、找出序列中出现次数最多的元素

首先collections.Counter(list/tuple/str)形成一个Counter对象,然后collections.Counter.most_common(N),即可得出“出现次数最多的前N个元素”。在底层实现中,Counter是一个字典,在元素和它们出现的次数之间做了映射;Counter之间是可以进行+-*/等数学运算的、用.update追加源数据以更新次数统计结果等;详情help(collections.Counter)

六、筛选「可同时替换」序列中的元素

列表推导式,示例:test = [n**2 if n > 0 else 0 for n in mylist]

针对复杂筛选条件,先将筛选逻辑放到单独的函数中,然后使用内建的filter()函数处理:test = list(filter(my_def, values)),只显示使my_def(通常为try-except结构)结果为True的value组成的列表

七、从字典中提取符合自定义条件的字集

示例:sub_dict = {key: value for key, value in my_dict.items() if value > 200或if key in other_dict}

八、enumerate(iterable, start=0),为原始对象添加index序列,可自定义index起始数字

>>> for i,j in enumerate({‘a‘:1,‘b‘:2}.items(), start=10):
...  print(i, j)
...
10 (‘b‘, 2)
11 (‘a‘, 1)

九、内置函数:sorted、reversed,不修改源数据;.sort、.reverse是列表、字典等的方法,原地修改源数据

sorted(iterable, key=None, reverse=False)

十、abs(int/float)、any(iterable)、all(iterable)

abs:返回绝对值

all():如果迭代器里面的任何元素都非零或非空,返回True;否则返回False

any():如果迭代器里面的其中一个或多个元素非零或非空,返回True;否则返回False

十一、 转换并同时计算数据:使用生成器推导式————高效、优雅;生成器方案会以迭代的方式转换数据,更省内存

# Determine if any .py files exist in a directory
import os
files = os.listdir(‘dirname‘)
if any(name.endswith(‘.py‘) for name in files):
    print(‘There be python!‘)
else:
    print(‘Sorry, no python.‘)
# Output a tuple as CSV
s = (‘ACME‘, 50, 123.45)
print(‘,‘.join(str(x) for x in s))    #join处理的对象是字符串
# Data reduction across fields of a data structure
portfolio = [
    {‘name‘:‘GOOG‘, ‘shares‘: 50},
    {‘name‘:‘YHOO‘, ‘shares‘: 75},
    {‘name‘:‘AOL‘, ‘shares‘: 20},
    {‘name‘:‘SCOX‘, ‘shares‘: 65}
]
min_shares = min(s[‘shares‘] for s in portfolio)

# Original: Returns 20
min_shares = min(s[‘shares‘] for s in portfolio)
# Alternative: Returns {‘name‘: ‘AOL‘, ‘shares‘: 20}
min_shares = min(portfolio, key=lambda s: s[‘shares‘])    #生成一个迭代器

十二、合并多个字典或映射

思路1:from collections import ChainMap,仅是在逻辑上连接两个字典,并不创建新字典,优先查询位置在前的字典的数据,原字典的数据变动可以同步体现

a = {‘x‘: 1, ‘z‘: 3 }
b = {‘y‘: 2, ‘z‘: 4 }

from collections import ChainMap
c = ChainMap(a,b)
print(c[‘x‘]) # Outputs 1 (from a)
print(c[‘y‘]) # Outputs 2 (from b)
print(c[‘z‘]) # Outputs 3 (from a)

思路2:dict_bak.update({new_dict}),更新原字典(的副本),原重复的key的value将被覆盖,仅能查询到新字典中的数据,原字典的变动无法同步体现

test = dict(a)    #用dict生成原字典的副本,不破坏原字典数据c = test.update(b)
print(c[‘z‘]) # Outputs 4 (from b)
时间: 2024-11-05 22:05:23

Python3 From Zero——{最初的意识:数据结构和算法}的相关文章

Python3 From Zero——{最初的意识:000~Initial consciousness『REVIEW』}

a.编码默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串,也可以为源码文件指定不同的编码:# -*- coding: cp-1252 -*- b.python保留字 保留字即关键字,我们不能把它们用作任何标识符名称.Python的标准库提供了一个keyword module,可以输出当前版本的所有关键字: >>> import keyword >>> keyword.kwlist ['False', 'None', 'T

Python3 From Zero——{最初的意识:006~数据编码与处理}

一.读写CSV数据: #!/usr/bin/env python3 #-*- coding=utf8 -*- import csv with open('kxtx.csv', 'rt') as f: f_csv = csv.DictReader(f) for x in f_csv: print(x) if x['货物名称'] == '电机': break [email protected] ~/py_script $ python3 csv_test.py {'开单网点组织编号': 'C0502

Python3 From Zero——{最初的意识:015~初级实例演练}

一.构显国际橡棋8x8棋盘 #!/usr/bin/env python3 #-*- coding:utf-8 -*- color_0="\033[41m \033[00m" color_1="\033[46m \033[00m" def line(a, b): for i in range(0,48): if ((i // 8) % 2) == 0: print(a, end='') else: print(b, end='') for x in range(0,

Python3 From Zero——{最初的意识:004~迭代器和生成器}

一.反向迭代:reversed() >>> a [1, 2, 3, 4] >>> for x in reversed(a): ... print(x, end=' ') ... 4 3 2 1 #反向迭代只有在待处理的对象具有确定的大小或者对象实现了__reversed()__特殊方法时才能奏效,否则必须先将对象转化为列表(可能消耗大量内存) >>> with open('/etc/passwd', 'rt') as file: ... for x i

Python3 From Zero——{最初的意识:007~函数}

一.编写可接受任意数量参数的函数:*.** >>> def test(x, *args, y, **kwargs): ... pass ... >>> test(1, 2, 3, 4 ,5 ,5, y=9, aa=99, bb=88,cc=900) >>> test(1, 2, 3, 4 ,5 ,5, 9, aa=99, bb=88,cc=900) Traceback (most recent call last): File "<st

数据结构与算法5: 递归(Recursion)

数据结构与算法5: 递归(Recursion) 写在前面 <软件随想录:程序员部落酋长Joel谈软件>一书中<学校只教java的危险性>一章提到,大学计算机系专业课有两个传统的知识点,但许多人从来都没搞懂过,那就是指针和递归.我也很遗憾没能早点熟练掌握这两个知识点.本节一些关键知识点和部分例子,都整理自教材或者网络,参考资料列在末尾.如果错误请纠正我. 思考列表: 1)什么程序具有递归解决的潜质? 2)递归还是非递归算法,怎么选择? 3)递归程序构造的一般模式 1.递归定义 首要引

数据结构与算法---字符串(上)

   hey,you guys. 好久没有继续我们的数据结构学习了,今天让我们一起来学习,开发中非常重要的一种数据类型--字符串.关于字符串,大家应该不会陌生.例如,我们做web开发,需要校验用户输入的注册信息是否合法,或者判断用户输入的账户.密码.是否正确等等.我们通过调用字符串的相关函数,就可以解决我们的需求.古语有云:"知其然,知其所以然".我们要做的,不仅仅是会调用字符串的方法,更要明白这些方法的原理.例如,在没有学习字符串之前,我认为要比较两个字符串是否相等,只需这样: st

2016计算机考研:数据结构常用算法精析

不知道博客园有没有计算机专业的考研党,希望列举的计算机考研考点能帮助大家吧,以下就是数据结构常用算法精析,如果大家看有什么不对的地方,欢迎纠错指正啊哈哈哈.2016考研加油!!!!!!!!! 内部排序(在内存中进行的排序不需要访问外存的)外部排序(排序量很大,通过分批的读写外存,最终完成排序) 稳定排序和非稳定排序:看相同记录的相对次序是否回发生改变.主要看在排序过程中的比较是不是相邻记录,如果是相邻比较,一定是稳定的排序.如果不是相邻的比较,就是不稳定的. 内排序方法 截止目前,各种内排序方法

Java数据结构和算法(九)——高级排序

春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大,那么这三种简单的排序所需要的时间则是我们所不能接受的.接着我们在讲解递归 的时候,介绍了归并排序,归并排序需要O(NlogN),这比简单排序要快了很多,但是归并排序有个缺点,它需要的空间是原始数组空间的两倍,当我们需要排序的数据占据了整个内存的一半以上的空间,那么是不能使用归并排序的. 本篇博客将