工作中經(jīng)常要處理各種各樣的數(shù)據(jù),遇到項(xiàng)目趕進(jìn)度的時(shí)候自己寫函數(shù)容易浪費(fèi)時(shí)間。
Python 中有很多內(nèi)置函數(shù)幫你提高工作效率!
一:在列表,字典中根據(jù)條件篩選數(shù)據(jù)
1.假設(shè)有一個(gè)數(shù)字列表 data, 過(guò)濾列表中的負(fù)數(shù)
列表推導(dǎo)式
result
=
[
i
for
i
in
data
if
i
>=
0
]
filter
result
=
filter
(
lambda
x
:
x
>=
0
,
data
)
2.學(xué)生的數(shù)學(xué)分?jǐn)?shù)以字典形式存儲(chǔ),篩選其中分?jǐn)?shù)大于 80 分的同學(xué)
d
=
{
x
:
randint
(
50
,
100
)
for
x
in
range
(
1
,
21
)
}
{
k
:
v
for
k
,
v
in
d
.
items
(
)
if
v
>
80
}
二:對(duì)字典的鍵值對(duì)進(jìn)行翻轉(zhuǎn)
使用 zip() 函數(shù)
zip() 函數(shù)用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的列表。
>>
>
s1
=
{
x
:
randint
(
1
,
4
)
for
x
in
sample
(
'abfcdrg'
,
randint
(
1
,
5
)
)
}
>>
>
s1
{
'b'
:
1
,
'f'
:
4
,
'g'
:
3
,
'r'
:
1
}
>>
>
d
=
{
k
:
v
for
k
,
v
in
zip
(
s1
.
values
(
)
,
s1
.
keys
(
)
)
}
>>
>
d
{
1
:
'r'
,
4
:
'f'
,
3
:
'g'
}
二. 統(tǒng)計(jì)序列中元素出現(xiàn)的頻度
1.某隨機(jī)序列中,找到出現(xiàn)次數(shù)最高的3個(gè)元素,它們出現(xiàn)的次數(shù)是多少?
隨機(jī)序列如下:
data
=
[
randint
(
0
,
20
)
for
_
in
range
(
20
)
]
方法1: 可以使用字典來(lái)統(tǒng)計(jì),以列表中的數(shù)據(jù)為鍵,以出現(xiàn)的次數(shù)為值
from
random
import
randint
def
demo
(
)
:
data
=
[
randint
(
0
,
20
)
for
_
in
range
(
30
)
]
# 列表中出現(xiàn)數(shù)字出現(xiàn)的次數(shù)
d
=
dict
.
fromkeys
(
data
,
0
)
for
v
in
li
:
d
[
v
]
+=
1
return
d
方法2:直接使用 collections 模塊下面的 Counter 對(duì)象
>>
>
data
=
[
randint
(
0
,
20
)
for
_
in
range
(
30
)
]
>>
>
data
[
7
,
8
,
5
,
16
,
10
,
16
,
8
,
17
,
11
,
18
,
11
,
17
,
15
,
7
,
2
,
19
,
5
,
16
,
17
,
17
,
12
,
19
,
9
,
10
,
0
,
20
,
11
,
2
,
11
,
10
]
>>
>
c2
=
Counter
(
data
)
>>
>
c2
Counter
(
{
17
:
4
,
11
:
4
,
16
:
3
,
10
:
3
,
7
:
2
,
8
:
2
,
5
:
2
,
2
:
2
,
19
:
2
,
18
:
1
,
15
:
1
,
12
:
1
,
9
:
1
,
0
:
1
,
20
:
1
}
)
>>
>
c2
[
14
]
4
>>
>
c2
.
most_common
(
3
)
# 統(tǒng)計(jì)頻度出現(xiàn)最高的3個(gè)數(shù)
[
(
17
,
4
)
,
(
11
,
4
)
,
(
16
,
3
)
]
2. 對(duì)某英文文章單詞進(jìn)行統(tǒng)計(jì),找到出現(xiàn)次數(shù)最高的單詞以及出現(xiàn)的次數(shù)
通過(guò)上面的練習(xí),我們知道可以用 Counter 來(lái)解決
import
re
from
collections
import
Counter
# 統(tǒng)計(jì)某個(gè)文章中英文單詞的詞頻
with
open
(
'test.txt'
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
d
=
f
.
read
(
)
total
=
re
.
split
(
'\W+'
,
d
)
# 所有的單詞列表
result
=
Counter
(
total
)
print
(
result
.
most_common
(
10
)
)
三.根據(jù)字典中值的大小,對(duì)字典中的項(xiàng)進(jìn)行排序
比如班級(jí)中學(xué)生的數(shù)學(xué)成績(jī)以字典的形式存儲(chǔ):
{
"Lnad"
:
88
,
"Jim"
,
71
.
.
.
}
請(qǐng)按數(shù)學(xué)成績(jī)從高到底進(jìn)行排序!
方法1: 利用 zip 將字典轉(zhuǎn)化為元祖,再用 sorted 進(jìn)行排序
>>
>
data
=
{
x
:
randint
(
60
,
100
)
for
x
in
"xyzfafs"
}
>>
>
data
{
'x'
:
73
,
'y'
:
69
,
'z'
:
76
,
'f'
:
61
,
'a'
:
64
,
's'
:
100
}
>>
>
sorted
(
data
)
[
'a'
,
'f'
,
's'
,
'x'
,
'y'
,
'z'
]
>>
>
data
=
sorted
(
zip
(
data
.
values
(
)
,
data
.
keys
(
)
)
)
>>
>
data
[
(
61
,
'f'
)
,
(
64
,
'a'
)
,
(
69
,
'y'
)
,
(
73
,
'x'
)
,
(
76
,
'z'
)
,
(
100
,
's'
)
]
方法2: 利用 sorted 函數(shù)的 key 參數(shù)
>>
>
data
.
items
(
)
>>
>
dict_items
(
[
(
'x'
,
64
)
,
(
'y'
,
74
)
,
(
'z'
,
66
)
,
(
'f'
,
62
)
,
(
'a'
,
80
)
,
(
's'
,
72
)
]
)
>>
>
sorted
(
data
.
items
(
)
,
key
=
lambda
x
:
x
[
1
]
)
[
(
'f'
,
62
)
,
(
'x'
,
64
)
,
(
'z'
,
66
)
,
(
's'
,
72
)
,
(
'y'
,
74
)
,
(
'a'
,
80
)
]
四. 在多個(gè)字典中找到公共鍵
實(shí)際場(chǎng)景:在足球聯(lián)賽中,統(tǒng)計(jì)每輪比賽都有進(jìn)球的球員
第一輪: {“C羅”: 1, “蘇亞雷斯”:2, “托雷斯”: 1…}
第二輪: {“內(nèi)馬爾”: 1, “梅西”:2, “姆巴佩”: 3…}
第三輪: {“姆巴佩”: 2, “C羅”:2, “內(nèi)馬爾”: 1…}
模擬隨機(jī)的進(jìn)球球員和進(jìn)球數(shù)
>>
>
s1
=
{
x
:
randint
(
1
,
4
)
for
x
in
sample
(
'abfcdrg'
,
randint
(
1
,
5
)
)
}
>>
>
s1
{
'd'
:
3
,
'g'
:
2
}
>>
>
s2
=
{
x
:
randint
(
1
,
4
)
for
x
in
sample
(
'abfcdrg'
,
randint
(
1
,
5
)
)
}
>>
>
s2
{
'b'
:
4
,
'g'
:
1
,
'f'
:
1
,
'r'
:
4
,
'd'
:
3
}
>>
>
s3
=
{
x
:
randint
(
1
,
4
)
for
x
in
sample
(
'abfcdrg'
,
randint
(
1
,
5
)
)
}
>>
>
s3
{
'b'
:
4
,
'r'
:
4
,
'a'
:
2
,
'g'
:
3
,
'c'
:
4
}
首先獲取字典的 keys,然后取每輪比賽 key 的交集
由于比賽輪次數(shù)是不定的,所以使用 map 來(lái)批量操作
map
(
dict
.
keys
,
[
s1
,
s2
,
s3
]
)
然后一直累積取其交集, 使用 reduce 函數(shù)
reduce
(
lambda
x
,
y
:
x
&
y
,
map
(
dict
.
keys
,
[
s1
,
s2
,
s3
]
)
)
一行代碼搞定!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(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ì)您有幫助就好】元
