1. 程式人生 > 其它 >Python基礎知識(列表推導式、字典推導式與條件推導式)

Python基礎知識(列表推導式、字典推導式與條件推導式)

一、列表推導式

  1)建立一個列表推導式。

# 需求:給出一個列表,通過迴圈,向列表中新增1-10的整數。
# 通常情況下,我們是這樣操作的。 lst = [] for i in range(1,11): lst.append(i) print(lst) >>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 如果使用列表推導式,我們是這樣操作的。 lst = [ i for i in range(1,11)] print(lst) # 程式碼可寫很多! >>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  2)列表推導式的兩種模式介紹

迴圈模式:[變數名(加工的變數) for 變數 in iterable]
篩選模式:[變數(加工變數) for 變數 in iterable if 條件]
# 迴圈模式:
# 需求1:將10以內所有整數的平方寫入列表
lst = [i ** 2 for i in range(1,11)]
print(lst)


>>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 需求2:將10以內所有的偶數寫入列表
lst = [i for i in range(2,11,2)]
print(lst)


# >>[2, 4, 6, 8, 10]
# 需求3:從python1期到python5期寫入列表lst
lst = ['python'+ str(i) for i in range(1,6)]
print(lst)


# >>['python1', 'python2', 'python3', 'python4', 'python5']
# 篩選模式:
# 需求1:將大於3的元素留下來
lst = [i for i in range(1,11) if i > 3]
print(lst)


>>[4, 5, 6, 7, 8, 9, 10]
# 需求2:三十以內可以被三整除的數
lst = [i for i in range(1,31) if i % 3 is 0]    #如果取模是0
print(lst)


# >>[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
# 需求3:找到巢狀列表中名字含有兩個‘e’的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

lst = [a.upper() for i in names for a in i if a.count('e') >= 2]

print(lst)


# >>['JEFFERSON', 'WESLEY', 'STEVEN', 'JENNIFER']

  3)補充內容

#列表推導式:【迴圈變數名 for 迴圈變數名 in 可迭代物件 if 條件判斷】
#(第一種)通常情況:
# a=[]
# for i in range(10):
#     a.append(i)
# print(a)
# #(第二種)列表推導式:
# # b=[i for i in range(10)]
# b=[i for i in range(10) if i>5]          #取出列表中大於5的值
# print(b)


num_in=int(input("請輸入數字!"))
def fib(num):
    if num<=0:
        raise Exception("數字應該大於0!")    #非迴圈中的異常處理
    if num==1 or num==2:
        return 1
    else:
        return fib(num-1)+fib(num-2)
# print(fib(num_in))

# fib_list=[fib(i) for i in range(1,num_in+1)]         #fib(i)得到前N個數的值
fib_list=[fib(num_in) for i in range(1,num_in+1)]     #fib(num_in)會得到最後N個N位置的值
print(fib_list) 

二、字典推導式

  1)字典推導式:是一個或多個迭代器快速簡潔的建立資料型別的一種方法。它將迴圈和條件判斷結合,從而避免語法冗長的程式碼,提高程式碼執行效率。類似於列表推導式,不同的是字典推導式返回的是一個字典,所以整個表示式需要寫在{}內部。

  2)字典推導式的語法格式:

# 第一種語法格式:
# key:字典中的key
# value:字典中的value
# dict.items():序列
# condition:條件表示式
# key_exp:for迴圈中,如果條件表示式conditionw為True,返回對應的key,value
# value_exp:for迴圈中,如果條件表示式condition為True,返回對應的key,value

# {表示式 for 迭代變數 in 可迭代物件 [if 條件表示式]}            # 用[]括起來的部分,可省略。
# {key_exp:value_exp for key,value in dict.items() if condition}


# 第二種語法格式:
# key:字典中的key
# value:字典中的value
# dict.items():序列
# condition:條件表示式
# key_exp:在for迴圈中,如果條件表示式condition為True,返回對應的key, value並作key_exp, value_exp處理
# value_exp1:在for迴圈中,如果條件表示式condition為True,返回對應的key, value並作key_exp, value_exp1處理
# value_exp2:在for迴圈中,如果條件表示式condition為False,返回對應的key, value並作key_exp, value_exp2處理

# {[if else條件表示式] 表示式 for 迭代變數 in 可迭代物件}
# {key_exp:value_exp1 if condition else value_exp2 for key,value in dict.items()}

  3)字典推導式案例

dict1 = {"a": 10, "B": 20, "C": True, "D": "hello world", "e": "python教程"}

# 需求1:獲取字典中key值是小寫字母的鍵值對
dict2 = {key: value for key, value in dict1.items() if key.islower()}

# 需求2:將字典中的所有key設定為小寫
dict3 = {key.lower(): value for key, value in dict1.items()}

# 需求3:將字典中所有key是小寫字母的value統一賦值為'error'
dict4 = {key: value if key.isupper() else "error" for key, value in dict1.items()}

print(dict2)
print(dict3)
print(dict4)


>>{'a': 10, 'e': 'python教程'}
>>{'a': 10, 'b': 20, 'c': True, 'd': 'hello world', 'e': 'python教程'}
>>{'a': 'error', 'B': 20, 'C': True, 'D': 'hello world', 'e': 'error'}
# 需求4:我們需要將獲取到字串格式的 cookies 轉換為字典 dict 格式。
cookies = 'ln_hurl=http://www.baidu.com;id=969937120;ver=7.0;loginfrom=null;wp_fold=0'

# 字典推導式
cookies = {cookie.split("=")[0]:cookie.split("=")[1] for cookie in cookies.split(";")}
print(cookies)


# >>{'ln_hurl': 'http://www.baidu.com', 'id': '969937120', 'ver': '7.0', 'loginfrom': 'null', 'wp_fold': '0'}
# 分析:在字串cookies中 ‘=’ 前面是key ,’=’ 後面是value ,每一個 ‘;’ 構成一個鍵值對;多個鍵值對構成一個字典;
# 1.根據 ‘;’ 將字串拆分為列表;
# 2.根據第一步獲取的列表,遍歷時將每一個字串根據 ‘=’ 再次拆分;
# 3.根據第二步拆分的結果,列表第一個元素作為key, 列表第二個元素作為value ;
# 字典推導式與列表推導式的區別:
# 1.列表推導式返回列表,表示式在中括號[]中。
# 2.字典推導式返回字典,表示式在大括號{}中。

三、條件推導式

  1)條件推導式:是從一個或者多個迭代器快速簡潔的建立資料型別的一種方法,它將迴圈和條件判斷結合,避免語法冗長的程式碼。

  2)語法結構:

# value1:如果條件表示式condition成立,返回value1 ; 如果條件表示式不成立,返回value2 ;
# condition:條件表示式
# Value2:如果條件表示式condition成立,返回value1 ; 如果條件表示式不成立,返回value2 ;

 value1 if condition else Value2

  3)條件推導式案例:

# 條件語句
x = 10
if x % 2 == 0:
    print("佩琪說:x是偶數")
else:
    print("佩琪說:x是奇數")

# 條件表示式語句
x = 15
print("佩琪說:x是偶數") if x % 2 == 0 else print("佩琪說:x是偶數")


>>佩琪說:x是偶數
>>佩琪說:x是偶數

四、列表推導式與生成器的區別

  1)列表推導式比較耗記憶體,所有資料一次性載入到記憶體。而.生成器表示式遵循迭代器協議,逐個產生元素。

  2)得到的值不一樣,列表推導式得到的是一個列表.生成器表示式獲取的是一個生成器。

  3)列表推導式一目瞭然,生成器表示式只是一個記憶體地址。

  4)無論是生成器表示式,還是列表推導式,他只是Python給你提供了一個相對簡單的構造方式,因為使用推導式非常簡單,所以大多數都會為之著迷,這個一定要深重,推導式只能構建相對複雜的並且有規律的物件,對於沒有什麼規律,而且巢狀層數比較多(for迴圈超過三層)這樣就不建議大家用推導式構建。

  5)生成器的惰性機制: 生成器只有在訪問的時候才取值,說白了.你找他要才給你值.不找他要.他是不會執行的。