deque

from collections import  deque
q = deque(maxlen=3)
q.append(1)
q.append(2)
q.append(3)
q.append(4)
q
>>> deque([2, 3, 4], maxlen=3)
q.pop()
>>> 4
q.popleft()
>>> 2

解构实现递归

def all_sum(numbers):
    head,*total = numbers
    return head+all_sum(total) if total else head
items = [1, 10, 7, 4, 5, 9]
all_sum(items)
>>> 36

寻找最大最小的n个元素

import heapq
nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
# print(heapq.nlargest(3, nums)) 
# print(heapq.nsmallest(3, nums)) 

portfolio = [
    {'name': 'IBM', 'shares': 100, 'price': 91.1},
    {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    {'name': 'FB', 'shares': 200, 'price': 21.09},
    {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    {'name': 'ACME', 'shares': 75, 'price': 115.65}
]
cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])
expensive

# heapq.heapify(nums) # [-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]
# heapq.heappop(nums)  # -4

字典中的键对应多个值

from collections import  defaultdict

list_container = defaultdict(list)
list_container['a'].append(1)
list_container['a'].append(2)
list_container['b'].append(4)
set_container = defaultdict(set)
set_container['a'].add(1)
set_container['a'].add(2)
set_container['b'].add(4)

按照字典的插入值的顺序保留顺序

from collections import OrderedDict

d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 3
d['grok'] = 4
# Outputs "foo 1", "bar 2", "spam 3", "grok 4"
for key in d:
    print(key, d[key])

字典的运算

prices = {
    'ACME': 45.23,
    'AAPL': 612.78,
    'IBM': 205.55,
    'HPQ': 37.20,
    'FB': 10.75
}

max(prices.keys()) # 'IBM'
max(prices.values()) # 612.78
# 上面两种方式只能得到最大最小的值,并不能知道这个值或键对应的键或值
max(zip(prices.values(),prices.keys()))
sorted(zip(prices.values(),prices.keys()))
>>> [(10.75, 'FB'),
 (37.2, 'HPQ'),
 (45.23, 'ACME'),
 (205.55, 'IBM'),
 (612.78, 'AAPL')]

查找两个字典中相同的键或值

a = {
    'x' : 1,
    'y' : 2,
    'z' : 3
}

b = {
    'w' : 10,
    'x' : 11,
    'y' : 2
}
a.items() & b.items() #{('y', 2)}
# a.keys() - b.keys()# {'z'}
>>> {('y', 2)}

序列中元素的出现次数

words = [
    'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes',
    'the', 'eyes', 'the', 'eyes', 'the', 'eyes', 'not', 'around', 'the',
    'eyes', "don't", 'look', 'around', 'the', 'eyes', 'look', 'into',
    'my', 'eyes', "you're", 'under'
]
from collections import Counter
word_counts = Counter(words)
# 出现频率最高的3个单词
top_three = word_counts.most_common(3)
print(top_three)
# Outputs [('eyes', 8), ('the', 5), ('look', 4)]

通过某个关键字给字典列表排序

from operator import itemgetter
rows = [
    {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
    {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
    {'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
    {'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]

rows_by_fname = sorted(rows, key=itemgetter('fname'))
rows_by_uid = sorted(rows, key=itemgetter('uid'))
row_by_lambda = sorted(rows,key=lambda x:x['fname'])
row_by_lambda
>>> [{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
 {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
 {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
 {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]

通过某个字段将列表中的元素分组

rows = [
    {'address': '5412 N CLARK', 'date': '07/01/2012'},
    {'address': '5148 N CLARK', 'date': '07/04/2012'},
    {'address': '5800 E 58TH', 'date': '07/02/2012'},
    {'address': '2122 N CLARK', 'date': '07/03/2012'},
    {'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},
    {'address': '1060 W ADDISON', 'date': '07/02/2012'},
    {'address': '4801 N BROADWAY', 'date': '07/01/2012'},
    {'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
]

from operator import itemgetter
from itertools import groupby

# Sort by the desired field first
rows.sort(key=itemgetter('date'))
# Iterate in groups
for date, items in groupby(rows, key=itemgetter('date')):
    print(date)
    for i in items:
        print(' ', i)
def Bubble_sort(arr):
    """冒泡排序指的是对相邻两个元素进行比较,如果前一个元素大于后一个元素,换掉两个元素的位置"""
    l = len(arr)
    for i in range(l):
        for j in range(0,l-i-1):
            if arr[j] > arr[j+1]:
                arr[j],arr[j+1] = arr[j+1],arr[j]
    return arr

Bubble_sort(a)
def select_sort(arr):
    """选择排序指的是从头开始遍历,固定开始遍历的元素,
    让后面的元素依次和这个元素比较,遍历结束然后将最小的元素和固定的元素比较,如果小于固定的元素
    就互相换位置"""
    l = len(arr)
    for i in range(l):
        min_index = i
        for j in range(i+1,l):
            if arr[j] < arr[min_index]:
                min_index = j
        arr[i],arr[min_index] = arr[min_index],arr[i]
    return  arr

select_sort(a)
def quick_sort(arr):
    """快速排序类似于二分法,将数组取中间值,
    然后将数组分为大于中间值,小于中间值,等于中间值三部分,
    然后依次对小于大于部分递归调用快速排序"""
    l = len(arr)
    if l<=1:return arr
    mid_num = arr[l//2]
    small_num = [i for i in arr if i < mid_num]
    mid_number = [i for i in arr if i == mid_num]
    big_num = [i for i in arr if i > mid_num]
    return quick_sort(small_num) + mid_number + quick_sort(big_num)

quick_sort(a)
def binary_serach(arr,target):
    low,hight = 0,len(arr)-1
    while low<=hight:
        mid = (low+hight) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid+1
        else:
            hight = mid -1
    return -1

# def binary_search(arr, target):
#     low, high = 0, len(arr) - 1  # 初始化搜索范围
#     while low <= high:
#         mid = (low + high) // 2  # 找到中间位置
#         if arr[mid] == target:  # 找到目标值
#             return mid
#         elif arr[mid] < target:  # 目标值在右半部分
#             low = mid + 1
#         else:  # 目标值在左半部分
#             high = mid - 1
#     return -1  # 未找到目标值
a = [11, 12, 22, 25, 34, 64, 90]
binary_serach(a,34)
def fibonacci(n):
    if n ==0:return []
    elif n == 1:return [0]
    elif n == 2: return [0,1]
    fibo_list = [0,1]
    for i in range(2,n):fibo_list.append(fibo_list[-1]+fibo_list[-2])
    return fibo_list

fibonacci(10)