python实用小技之数据结构

本文大多数例子搬自 python cookbook 这里是对学习的一个总结和提炼

ps:python版本为python3

1.解压序列赋值给多个变量

# 有一个包含 N 个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给 N 个变量?

data = ['ACME', 50, 91.1, (2012, 12, 21)]

# 任何的序列(或者是可迭代对象)可以通过一个简单的赋值语句解压并赋值给多个变量

# 变量的数量必须跟序列元素的数量是一样的

name, shares, prices, date = data

print(name, shares, prices, date, sep=" | ", end="\n")

# 如果只需要一部分,可以给个占位变量如

_, sha, pr, _ = data

print(sha,pr,sep=' | ')

运行结果:

ACME | 50 | 91.1 | (2012, 12, 21)

50 | 91.1

2.解压可迭代对象赋值给多个变量

# 解压可迭代对象赋值给多个变量

def drop_frist_last(grades):

    frist, *middle, last = grades

    return sum(middle) / len(middle)

print(drop_frist_last([0, 60, 70, 80, 100]))

# 有时候,你想解压一些元素后丢弃它们,可以使用 比如 _ 或者 ign

record = ('ACME', 50, 123.45, (12, 18, 2012))

name,*_,(*_,year) = record

print(name,year)

运行结果:

70.0

ACME 2012

3.保留有限的历史记录

'''

使用 deque(maxlen=N) 构造函数会新建一个固定大小的队列。当新的元素加入并且这个队列已满的时候, 最老的元素会自动被移除掉

'''

def search(lines, pattern, histroy=60):

    previous_lines = deque(maxlen=histroy)

    for line in lines:

        if pattern in line:

            yield line, previous_lines

            previous_lines.append(line)

            print(len(previous_lines))

            for item in previous_lines:

                print(item)

if __name__ == "__main__":

    with open(os.getcwd() + "/Lesson1.py") as f:

        for line, prevlines in search(f, '50', 3):

            print("type prevlines =", type(prevlines))

            for pline in prevlines:

                print('pline = ', pline, end='')

            print("type line =", type(line))

            # print('line = ', line, end='')

            print('-' * 20)

#           

4.怎样从一个集合中获得最大或者最小的 N 个元素列表?

# 当集合是一个列表是

nums = [3, 10, 5, 23, 7, -4, 18, 23, 42, 37, 2]

print(heapq.nlargest(3, nums))

print(heapq.nsmallest(3, nums))

# 如果是更负责的对象时候

mydirt = [

    {'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}]

print(heapq.nlargest(2, mydirt, key=lambda l: l['price']))

print(heapq.nsmallest(2, mydirt, key=lambda l: l['price']))

运行结果

[42, 37, 23]

[-4, 2, 3]

[{'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'IBM', 'shares': 100, 'price': 91.1}]

[{'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}]

ps:堆数据结构最重要的特征是 heap[0] 永远是最小的元素,另外 nlargest,nsmallest 适合查找的元素个数相对比较小的时候,如果你仅仅想查找唯一的最小或最大(N=1)的元素的话,那么使用 min() 和 max() 函数会更快些。 类似的,如果 N 的大小和集合大小接近的时候,通常先排序这个集合然后再使用切片操作会更快点 ( sorted(items)[:N] 或者是 sorted(items)[-N:] )

5.字典排序

'''

你想创建一个字典,并且在迭代或序列化这个字典的时候能够控制元素的顺序。

'''

from collections import OrderedDict

d = OrderedDict()

d['foo'] = 1

d['beer'] = 2

d['bar'] = 4

d['park'] = 3

for key in d:

    print(key, d[key])

执行结果:

foo 1

beer 2

bar 4

park 3

6.字典中的键映射多个值

from collections import defaultdict

df_d = defaultdict(list)

df_d['a'].append(1)

df_d['a'].append(2)

df_d['b'].append(4)

print(df_d)

d2 = defaultdict(set)

pairs = [('a', 1), ('a', 2), ('b', 4)]

for key, value in pairs:

    d2[key].add(value)

print(d2)

运行结果:

defaultdict(<class 'list'>, {'a': [1, 2], 'b': [4]})

defaultdict(<class 'set'>, {'a': {1, 2}, 'b': {4}})

7.字典的运算(求最小值、最大值、排序等)

prices = {

    'ACME': 45.23,

    'AAPL': 612.78,

    'IBM': 205.55,

    'HPQ': 37.20,

    'FB': 10.75

}

# 求最小值

# 方法 1,通过zip 函数创建的是一个只能访问一次的迭代,将键值反过来

print(min(zip(prices.values(), prices.keys())))

# 输出 (10.75, 'FB')

# 方法二 直接取values 获取最小值,不过你就不知道对于的key

print(min(prices.values()))

# 输出 10.75

# 方法三

min_key = min(prices, key=lambda k: prices[k])

print(prices[min_key])

# 输出 FB

# 排序

prices_sorted = sorted(zip(prices.values(), prices.keys()))

print(prices_sorted)

# 输出 [(10.75, 'FB'), (37.2, 'HPQ'), (45.23, 'ACME'), (205.55, 'IBM'), (612.78, 'AAPL')]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容