批量匹配可迭代对象
def drop_first_last(grades):
first, *middle, last = grades
return avg(middle)
record = (‘ACME‘, 50, 123.45, (12, 18, 2012))
name, *_, (*_, year) = record
双向队列
from collections import deque
def search(lines, pattern, history=5):
previous_lines = deque(maxlen=history)
for line in lines:
if pattern in line:
yield line, previous_lines
previous_lines.append(line)
q=deque(max_len=3) # 不指定max_len表示无限大小
q.append(a)
q.appendleft(a)
a=q.pop()
a=q.popleft()
import heapq
# 1. 防止KeyError,可以自动为将要访问的键创建映射实体,multidict
from collections import defaultdict
# 2. 保证顺序,迭代顺序为插入时的顺序,对于一个已经存在的键重新赋值也是如此
from collections import OrderedDict
# 3. 字典运算仅仅作用于键
min_price = min(zip(prices.values(), prices.keys())) # 现将键值反过来,然后用sorted或者min,注意一对多映射
min(prices, key=lambda k: prices[k]) # 用lambda作为key函数
# 4. 寻找字典的共同点,&/-可以作用于keys()或者items()
# Find keys in common
a.keys() & b.keys() # { ‘x‘, ‘y‘ }
# Find keys in a that are not in b
a.keys() - b.keys() # { ‘z‘ }
# Find (key,value) pairs in common
a.items() & b.items() # { (‘y‘, 2) }
c = {key:a[key] for key in a.keys() - {‘z‘, ‘w‘}}
5. 字典不是hashable的,需要转化为tuple才能使用in等函数
def dedupe(items, key=None):
seen = set()
for item in items:
val = item if key is None else key(item)
if val not in seen:
yield item
seen.add(val)
with open(somefile,‘r‘) as f: # 迭代器适合于文件等对象
for line in dedupe(f):
6. 创建方法
p1 = {key: value for key, value in prices.items() if value > 200}
p1 = dict((key, value) for key, value in prices.items() if value > 200)
SHARES = slice(20, 23)
# a = slice(5, 50, 2) # start/stop/step
PRICE = slice(31, 37)
cost = int(record[SHARES]) * float(record[PRICE])
# 通过调用切片的indices(size) 方法将它映射到一个确定大小的序列上,避免出现IndexError
s = ‘HelloWorld‘
a.indices(len(s)) # (5, 10, 2)
for i in range(*a.indices(len(s))):
print(s[i]) # Wr
collections.Counter(words).most_common()
word_counts.update(morewords)
# 并且Counter对象可以直接相加
# 字典,按指定键值,itemgetter
from operator import itemgetter
rows_by_fname = sorted(rows, key=itemgetter(‘fname‘))
rows_by_uid = sorted(rows, key=itemgetter(‘fname‘, ‘uid‘))
# 类对象列表,按成员变量,attrgetter
from operator import attrgetter
sorted(users, key=attrgetter(‘user_id‘))
[User(3), User(23), User(99)]
from operator import itemgetter
from itertools import groupby
# Sort by the desired field first
rows.sort(key=itemgetter(‘date‘))
# Iterate in groups
# groupby要求连续,返回主键与可迭代对象
for date, items in groupby(rows, key=itemgetter(‘date‘)):
print(date)
for i in items:
print(‘ ‘, i)
如果需要支持随机访问,可以使用多值字典
>>> from itertools import compress
>>> more5 = [n > 5 for n in counts] # Boolean列表
>>> list(compress(addresses, more5))
>>> from collections import namedtuple
>>> Subscriber = namedtuple(‘Subscriber‘, [‘addr‘, ‘joined‘])
>>> sub = Subscriber(‘jonesy@example.com‘, ‘2012-10-19‘)
可以用.
操作符,与下标相比意义更加明确,修改用a._replace(dict) 方法
nums = [1, 2, 3, 4, 5]
s = sum([x * x for x in nums]) # 多一步创建列表
s = sum(x * x for x in nums)
合并字典,重复的以第一次为准,删除也只对第一个字典有效,本身没有创建字典
ChainMap 对于编程语言中的作用范围变量(比如globals , locals 等)是非常有用的
update或许更加常用,但是他创建了新的字典
sfrom collections import ChainMap
原文:https://www.cnblogs.com/lyricode/p/12995958.html