Python列表解析式怎么使用

這篇文章主要介紹了Python列表解析式怎么使用的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Python列表解析式怎么使用文章都會有所收獲,下面我們一起來看看吧。

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計制作、做網(wǎng)站、仲巴網(wǎng)絡(luò)推廣、小程序開發(fā)、仲巴網(wǎng)絡(luò)營銷、仲巴企業(yè)策劃、仲巴品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供仲巴建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

列表解析式的優(yōu)勢

  • 比循環(huán)更節(jié)省時間和空間。

  • 需要更少的代碼行。

  • 可將迭代語句轉(zhuǎn)換為公式。

如何在Python中創(chuàng)建列表

列表解析式是一種基于現(xiàn)有列表創(chuàng)建列表的語法結(jié)構(gòu)。讓我們來看看創(chuàng)建列表的不同實現(xiàn)

循環(huán)

循環(huán)是創(chuàng)建列表的傳統(tǒng)方式。不管你使用什么樣的循環(huán)。要以這種方式創(chuàng)建列表,您應(yīng)該:

  1. 實例化一個空列表。

  2. 循環(huán)遍歷一個可迭代的(如range)的元素。

  3. 將每個元素附加到列表的末尾。

numbers = []
for number in range(10):
numbers.append(number)

print(numbers)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

在此示例中,您實例化了一個空列表 numbers。然后使用 for 循環(huán)迭代 range(10) 并使用 append() 方法將每個數(shù)字附加到列表的末尾。

map() 對象

map() 是創(chuàng)建列表的另一種方法。您需要向 map() 傳遞一個函數(shù)和一個可迭代對象,之后它會創(chuàng)建一個對象。該對象包含使用指定函數(shù)執(zhí)行每個迭代元素所獲得的輸出。

例如,我們將呈現(xiàn)在某些產(chǎn)品的價格中增加增值稅的任務(wù)。

VAT_PERCENT = 0.1# 10%


def add_vat(price):
return price + (price * VAT_PERCENT)


prices = [10.03, 8.6, 32.85, 41.5, 22.64]
grand_prices = map(add_vat, prices)
print(grand_prices)
grand_prices = list(grand_prices)
print(grand_prices)

您已經(jīng)構(gòu)建了 add_vat() 函數(shù)并創(chuàng)建了 prices 可迭代對象。您將這兩個參數(shù)都傳遞給 map() 并收集生成的 map 對象 grand_prices,或者您可以使用 list() 輕松地將其轉(zhuǎn)換為列表。

# map(add_vat, prices)
[11.03, 9.46, 36.14, 45.65, 24.9]# list(grand_prices)
列表解析式

現(xiàn)在,讓我們看一下列表解析式方法!這確實是 Python 風(fēng)格,并且是創(chuàng)建列表的更好方法。為了弄清楚這種方法有多強(qiáng)大,我們用一個單行代碼來重寫那個循環(huán)示例。

numbers = [number for number in range(10)]
print(numbers)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

正如您所見,這是一種不可思議的方法!列表解析式看起來足夠可讀,您不需要編寫更多代碼,而只需一行。

為了更好地理解列表,請查看以下語法格式:

new_list = [expression for member in iterable]

哪種方法更有效

好的,我們已經(jīng)學(xué)習(xí)了如何使用循環(huán)、map() 和列表解析式來創(chuàng)建列表,在您的腦海中可能會提出“哪種方法更有效”的問題。我們來分析一下吧!

import random
import timeit


VAT_PERCENT = 0.1
PRICES = [random.randrange(100) for x in range(100000)]


def add_vat(price):
return price + (price * VAT_PERCENT)


def get_grand_prices_with_map():
return list(map(add_vat, PRICES))


def get_grand_prices_with_comprehension():
return [add_vat(price) for price in PRICES]


def get_grand_prices_with_loop():
grand_prices = []
for price in PRICES:
grand_prices.append(add_vat(price))
return grand_prices


print(timeit.timeit(get_grand_prices_with_map, number=100))
print(timeit.timeit(add_grand_prices_with_comprehension, number=100))
print(timeit.timeit(get_grand_prices_with_loop, number=100))
0.9833468980004909# with_map
1.197223742999995 # with_comprehension
1.3564663889992516# with_loop

正如我們現(xiàn)在所看到的,創(chuàng)建列表的最優(yōu)的方法是 map(),排在第二位的是列表解析式,最后是循環(huán)。

但是,方法的選擇應(yīng)取決于您想要實現(xiàn)的目標(biāo)。

  • 使用map() 可以使你的代碼更高效。

  • 使用循環(huán)可以使代碼的思路展現(xiàn)更加清晰。

  • 使用列表解析式可以您使代碼更加緊湊,且較高效。這是創(chuàng)建列表的最佳方式,因為這種方式可讀性最強(qiáng)。

高級解析式

條件邏輯

早些時候,我向您展示了這個公式:

new_list = [expression for member in iterable]

公式可能有些不完整。對解析式的更加完整描述增加了對可選條件的支持。將條件邏輯添加到列表解析式的最常見方法是在表達(dá)式的末尾添加條件:

new_list = [expression for member in iterable (if conditional)]

在這里,您的條件語句正好位于右邊的括號中。

條件很重要,因為它們允許列表解析式過濾掉不需要的值,這在一般情況下也可以調(diào)用 filter():

numbers = [number for number in range(20) if number % 2 == 0]
print(numbers)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

正如您所看到的那樣,這個解析式收集了可被 2 整除且沒有余數(shù)的數(shù)字。

如果您需要更復(fù)雜的過濾器,那么您甚至可以將條件邏輯移動到單獨的函數(shù)中。

def is_prime(number):
if number > 1:
for el in range(2, int(number/2)+1):
if (number % el) == 0:
return False 
else:
return True


numbers = [number for number in range(20) if is_prime(number)]
print(numbers)
[2, 3, 5, 7, 11, 13, 17, 19]

您構(gòu)建 is_prime(number) 以確定是否是素數(shù)并返回布爾值。接下來,您應(yīng)該將函數(shù)添加到解析式的條件中。

該公式允許您使用條件邏輯從幾個可能的輸出選項中進(jìn)行選擇。例如,您有一個產(chǎn)品價格表,若有負(fù)數(shù),您應(yīng)將其轉(zhuǎn)換為正數(shù):

price_list = [1.34, 19.01, -4.2, 6, 8.78, -1,1]
normalized_price_list = [price if price > 0 else price*-1 for price in price_list]
print(normalized_price_list)
[1.34, 19.01, 4.2, 6, 8.78, 1,1]

在這里,您的表達(dá)式 price 有一個條件語句,如果 price > 0 else price*-1。這會告訴 Python,如果價格為正,則輸出價格值;但如果價格為負(fù),則將價格轉(zhuǎn)換為正值。該功能很強(qiáng)大,考慮將條件邏輯視為其自身的函數(shù)的確是很有用的:

def normalize_price(price):
return price if price > 0 else price*-1


price_list = [1.34, 19.01, -4.2, 6, 8.78, -1,1]
normalized_price_list = [normalize_price(price) for price in price_list]
print(normalized_price_list)
[1.34, 19.01, 4.2, 6, 8.78, 1,1]
集合解析式

您還可以創(chuàng)建一個集合解析式!它基本與列表解析式相同。不同之處在于集合解析式不包含重復(fù)項。您可以通過使用花括號取代方括號來創(chuàng)建集合解析式:

string = "Excellent"
unique_string = {letter for letter in string}
print(unique_string)
{"E", "e", "n", "t", "x", "c", "l"}

你的集合解析式只包含唯一的字母。這與列表不同,集合不保證項目將以特定順序存儲數(shù)據(jù)。這就是為什么集合輸出的第二個字母是 e,即使字符串中的第二個字母是 x。

字典解析式

字典解析式也是是類似的,但需要定義一個鍵:

string = "Words are but wind"
word_order = {el: ind+1 for ind, el in enumerate(string.split())}
print(word_order)
{"Words": 1, "are": 2, "but": 3, "wind": 4}

要創(chuàng)建 word_order 字典,請在表達(dá)式中使用花括號 ({}) 以及鍵值對 (el: ind+1)。

海象運算符

Python 3.8 中引入的海象運算符允許您一次解決兩個問題:為變量賦值,返回該值。

假設(shè)您需要對將返回溫度數(shù)據(jù)的 API 應(yīng)用十次。您想要的只是 100 華氏度以上的結(jié)果。而每個請求可能都會返回不同的數(shù)據(jù)。在這種情況下,沒有辦法在 Python 中使用列表解析式來解決問題??傻蓡T(如果有條件)的公式表達(dá)式無法讓條件將數(shù)據(jù)分配給表達(dá)式可以訪問的變量。

海象運算符解決了這個問題。它允許您在執(zhí)行表達(dá)式的同時將輸出值分配給變量。以下示例顯示了這是如何實現(xiàn)的,使用 get_weather_data() 生成偽天氣數(shù)據(jù):

import random


def get_weather_data():
return random.randrange(90, 110)


hot_temps = [temp for item in range(20) if (temp := get_weather_data()) >= 100]
print(hot_temps)
[108, 100, 106, 103, 108, 106, 103, 104, 109, 106]

什么時候不要使用解析式

列表解析式非常有用,它可以幫助您編寫清晰且易于閱讀和調(diào)試的代碼。但在某些情況下,它們可能會使您的代碼運行速度變慢或使用更多內(nèi)存。如果它讓您的代碼效率更低或更難理解,那么可以考慮選擇另一種方式。

注意嵌套的解析式

可以通過嵌套解析式以創(chuàng)建列表、字典和集合的組合集合(譯者注:這個集合不是指 set 對象類型,而是 collection,泛指容器)。例如,假設(shè)一家公司正在跟蹤一年中五個不同城市的收入。存儲這些數(shù)據(jù)的完美數(shù)據(jù)結(jié)構(gòu)可以是嵌套在字典解析式中的列表解析式。

cities = ['New York', 'Oklahoma', 'Toronto', 'Los Angeles', 'Miami']
budgets = {city: [0 for x in range(12)] for city in cities}
print(budgets)
{
"NewYork": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"Oklahoma": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"Toronto": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"LosAngeles": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"Miami": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}

您使用字典解析式創(chuàng)建了 budgets 容器。該表達(dá)式是一個鍵值對,其中包含另一個解析式。此代碼將快速生成城市中每個 city 的數(shù)據(jù)列表。

嵌套列表是創(chuàng)建矩陣的常用方法,通常用于數(shù)學(xué)目的。查看下面的代碼塊:

matrix = [[x for x in range(7)] for y in range(6)]
print(matrix)
[
[0, 1, 2, 3, 4, 5, 6],
[0, 1, 2, 3, 4, 5, 6],
[0, 1, 2, 3, 4, 5, 6],
[0, 1, 2, 3, 4, 5, 6],
[0, 1, 2, 3, 4, 5, 6],
[0, 1, 2, 3, 4, 5, 6]
]

外部列表解析式 [... for y in range(6)] 創(chuàng)建了六行,而內(nèi)部列表解析式 [x for x in range(7)] 將用值填充這些行中的每一行。

到目前為止,每個嵌套解析式的目標(biāo)都是真正且直觀的。但是,還有一些其他情況,例如創(chuàng)建扁平化的嵌套列表,其中的邏輯可以使您的代碼非常難以閱讀。讓我們看下面的例子,使用嵌套列表解析式來展平一個矩陣:

matrix = [
[0, 1, 0],
[1, 0, 1],
[2, 1, 2],
]
flat = [num for row in matrix for num in row]
print(flat)
[0, 1, 0, 1, 0, 1, 2, 1, 2]

扁平化矩陣的代碼確實很簡潔,但是太難理解了,您應(yīng)該花點時間弄清楚它是如何工作的。另一方面,如果您使用 for 循環(huán)來展平相同的矩陣,那么您的代碼將更加簡單易讀:

matrix = [
[0, 1, 0],
[1, 0, 1],
[2, 1, 2],
]
flat = []
for row in matrix:
for num in row:
flat.append(num)
print(flat)
[0, 1, 0, 1, 0, 1, 2, 1, 2]

現(xiàn)在,您可以看到代碼一次遍歷矩陣的一行,在移動到下一行之前取出該行中的所有元素。

雖然嵌套列表解析式可能看起來更具有 Python 風(fēng)格,但對于能夠編寫出您的團(tuán)隊可以輕松理解和修改的代碼來才是更加最重要的。當(dāng)選擇一個方法時,您應(yīng)該根據(jù)解析式是有助于還是有損于可讀性來做出相應(yīng)的判斷。

為大型數(shù)據(jù)集使用生成器

Python 中的列表解析式通過將整個列表存儲到內(nèi)存中來工作。對于小型至中型列表這通常很好。如果您想將前一千個整數(shù)相加,那么列表解析式將輕松地解決此任務(wù):

summary = sum([x for x in range(1000)])
print(summary)
499500

但是,如果您需要對十億個數(shù)字求和呢?您可以嘗試執(zhí)行此操作,但您的計算機(jī)可能不會有響應(yīng)。這是可能因為計算機(jī)中分配大量內(nèi)存。也許您是因為計算機(jī)沒有如此多的內(nèi)存資源。

例如,你想要一些第一個十億整數(shù),那么讓我們使用生成器!這可能多需要一些時間,但計算機(jī)應(yīng)該可以克服它:

summary = sum((x for x in range(1000000000)))
print(summary)
499999999500000000

讓我們來對比一下哪種方法是更優(yōu)的!

import timeit


def get_sum_with_map():
return sum(map(lambda x: x, range(1000000000)))


def get_sum_with_generator():
return sum((x for x in range(1000000000)))


print(timeit.timeit(get_sum_with_map, number=100))
print(timeit.timeit(get_sum_with_generator, number=100))
4940.844053814# get_sum_with_map
3464.1995523349997# get_sum_with_generator

關(guān)于“Python列表解析式怎么使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Python列表解析式怎么使用”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文名稱:Python列表解析式怎么使用
本文鏈接:http://muchs.cn/article8/ipgoop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷網(wǎng)頁設(shè)計公司、服務(wù)器托管、面包屑導(dǎo)航Google、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)