PYTHON-COOKBOOK
文章目錄
- PYTHON-COOKBOOK
- 一:數(shù)據(jù)結(jié)構(gòu)和算法
- 1、Heapq
- 取出最大或最小的幾個(gè)元素
- 優(yōu)先級(jí)隊(duì)列
- 2、字典
- 多值字典
- 字典排序
- 字典列表排序
- 字典共同點(diǎn)和不同點(diǎn)
- 3、collections
- 保留最后幾個(gè)元素
- 頻率統(tǒng)計(jì)
- 命名元組
- 字典(映射)聯(lián)合查找
- 4、其他
- 解壓賦值
- 去重且保持順序
- 切片
- 分組
一:數(shù)據(jù)結(jié)構(gòu)和算法
三個(gè)基本的寫(xiě)法:
- 列表生成式
- 字典生成式
- 迭代器生成式
1、Heapq
取出最大或最小的幾個(gè)元素
# 最大或者最小的n個(gè)元素
import
random
from
heapq
import
nsmallest
,
nlargest
tt
=
[
random
.
randint
(
1
,
10000
)
for
i
in
range
(
1000
)
]
# 取出的元素較少
%
time nsmallest
(
7
,
tt
)
%
time nlargest
(
7
,
tt
)
# 取出的元素很多
%
time
sorted
(
tt
)
[
:
7
]
%
time
sorted
(
tt
)
[
-
7
:
]
# 只取出最大的或者最小的
%
time
min
(
tt
)
%
time
max
(
tt
)
優(yōu)先級(jí)隊(duì)列
import
heapq
class
PriorityQueue
:
def
__init__
(
self
)
:
self
.
_queue
=
[
]
def
push
(
self
,
item
,
priority
)
:
heapq
.
heappush
(
self
.
_queue
,
(
priority
,
item
)
)
def
pop
(
self
)
:
r
=
heapq
.
heappop
(
self
.
_queue
)
return
r
pp
=
PriorityQueue
(
)
pp
.
push
(
'a'
,
3
)
pp
.
push
(
'b'
,
9
)
pp
.
push
(
'c'
,
6
)
pp
.
push
(
'd'
,
3
)
for
i
in
range
(
4
)
:
print
(
pp
.
pop
(
)
)
2、字典
多值字典
from
collections
import
defaultdict
d
=
defaultdict
(
list
)
d
[
'a'
]
.
append
(
1
)
d
[
'a'
]
.
append
(
2
)
d
[
'b'
]
.
append
(
4
)
# dd = defaultdict(tuple)
字典排序
# 字典排序
shares
=
{
'ACME'
:
45.23
,
'AAPL'
:
612.78
,
'IBM'
:
205.55
,
'HPQ'
:
37.20
,
'FB'
:
10.75
}
rev_shares
=
list
(
zip
(
shares
.
values
(
)
,
shares
.
keys
(
)
)
)
print
(
min
(
rev_shares
)
)
print
(
max
(
rev_shares
)
)
print
(
sorted
(
rev_shares
)
)
字典列表排序
# 字典列表的排序
from
operator
import
itemgetter
aa
=
[
{
'name'
:
'bob'
,
'score'
:
10
}
,
{
'name'
:
'ming'
,
'score'
:
12
}
,
{
'name'
:
'mike'
,
'score'
:
1
}
]
sorted
(
aa
,
key
=
itemgetter
(
'score'
)
)
字典共同點(diǎn)和不同點(diǎn)
# 字典的共同點(diǎn) 和 不同點(diǎn)
a
=
{
'x'
:
1
,
'y'
:
2
,
'z'
:
3
}
b
=
{
'w'
:
10
,
'x'
:
11
,
'y'
:
2
}
print
(
a
.
keys
(
)
&
b
.
keys
(
)
)
print
(
a
.
keys
(
)
-
b
.
keys
(
)
)
3、collections
保留最后幾個(gè)元素
# 保留最后幾個(gè)元素
from
collections
import
deque
def
lastN
(
ll
)
:
dq
=
deque
(
maxlen
=
3
)
for
i
in
ll
:
# yield i
dq
.
append
(
i
)
return
dq
aa
=
[
1
,
2
,
67
,
4
,
3
,
6
,
87
,
4
]
lastN
(
aa
)
頻率統(tǒng)計(jì)
# 統(tǒng)計(jì)出現(xiàn)頻率
import
random
from
collections
import
Counter
aa
=
[
random
.
randint
(
1
,
10
)
for
x
in
range
(
30
)
]
res
=
Counter
(
aa
)
print
(
res
)
print
(
res
.
most_common
(
3
)
)
命名元組
# 命名元組
from
collections
import
namedtuple
sub
=
namedtuple
(
'sub'
,
[
'name'
,
'score'
]
)
s
=
sub
(
'bob'
,
'87'
)
print
(
s
.
name
)
print
(
s
.
score
)
字典(映射)聯(lián)合查找
from
collections
import
ChainMap
a
=
{
'x'
:
1
,
'z'
:
3
}
b
=
{
'y'
:
2
,
'z'
:
4
}
c
=
{
'd'
:
5
,
'z'
:
9
}
md
=
ChainMap
(
a
,
b
,
c
)
print
(
md
.
get
(
'x'
)
)
print
(
md
.
get
(
'z'
)
)
print
(
md
.
get
(
'yzz'
)
)
4、其他
解壓賦值
# 解壓賦值
record
=
(
'Dave'
,
'dave@example.com'
,
'773-555-1212'
,
'847-555-1212'
)
name
,
_
,
*
phone
=
record
print
(
name
)
print
(
phone
)
去重且保持順序
# 去重并且保持順序
def
dedupe
(
ll
)
:
seen
=
set
(
)
for
item
in
ll
:
if
item
not
in
seen
:
yield
item
seen
.
add
(
item
)
return
seen
a
=
[
1
,
2
,
56
,
7
,
4
,
8
,
32
,
8
,
4
,
76
,
8
,
43
,
3
]
print
(
list
(
dedupe
(
a
)
)
)
切片
# 切片命名
a
=
'----80-34--------8000---'
b
=
'----60-22--------7867---'
iid
=
slice
(
4
,
6
)
age
=
slice
(
7
,
9
)
salary
=
slice
(
17
,
21
)
print
(
a
[
iid
]
)
print
(
b
[
salary
]
)
分組
# 分組
from
operator
import
itemgetter
from
itertools
import
groupby
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'
}
,
]
rows
.
sort
(
key
=
itemgetter
(
'date'
)
)
for
date
,
items
in
groupby
(
rows
,
itemgetter
(
'date'
)
)
:
print
(
date
)
for
i
in
items
:
print
(
i
)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
