1 平方列表
如果你想創建一個包含1到10的平方的列表,你可以這樣做:
squares = []for x in range(10): squares.append(x**2)
這是一個簡單的例子,但是使用列表生成式可以更簡潔地創建這個列表。
squares = [x**2 for x in range(10)]
這個最簡單的列表生成式由方括號開始,方括號內部先是一個表達式,其后跟著一個for語句。列表生成式總是返回一個列表。
2 整除3的數字列表
通常,你可能這樣寫:
numbers = []for x in range(100): if x % 3 == 0: numbers.append(x)
你可以在列表生成式里包含一個if語句,來有條件地為列表添加項。為了創建一個包含0到100間能被3整除的數字列表,可以使用列表推導式:
numbers = [x for x in range(100) if x % 3 == 0]
3 找出質數
這通常要使用好幾行代碼來實現。
noprimes = []for i in range(2, 8): for j in range(i*2, 50, i): noprimes.append(j)primes = []for x in range(2, 50): if x not in noprimes: primes.append(x)
不過,你可以使用兩個列表生成式來簡化代碼。
noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]primes = [x for x in range(2, 50) if x not in noprimes]
第一行代碼在一個列表生成式里使用了多層for循環。第一個循環是外部循環,第二個循環是是內部循環。為了找到質數,我們首先找到一個非質數的列表。通過找出2-7的倍數來產生這個非質數列表。然后我們循環遍歷數字并查看每個數字是否在非質數列表。
修正:正如reddit上的shoyer指出的,使用集合(set)來查找noprimes(代碼里的屬性參數,譯者注)效率更高。由于noprimes應該只包含唯一的值,并且我們頻繁地去檢查一個值是否存在,所以我們應該使用集合。集合的使用語法和列表的使用語法類似,所以我們可以這樣使用:
noprimes = set(j for i in range(2, 8) for j in range(i*2, 50, i))primes = [x for x in range(2, 50) if x not in noprimes]
4 嵌套列表降維
假設你有一個列表的列表(列表里包含列表)或者一個矩陣,
matrix = [[0,1,2,3], [4,5,6,7], [8,9,10,11]]
并且你想把它降維到一個一維列表。你可以這樣做:
flattened = []for row in matrix: for i in row: flattened.append(i)
使用列表生成式:
flattened = [i for row in matrix for i in row]
這使用了兩個for循環去迭代整個矩陣。外層(第一個)循環按行迭代,內部(第二個)循環對該行的每個項進行迭代。
5 模擬多個擲硬幣事件
假設需要模擬多次擲硬幣事件,其中0表示正面,1表示反面,你可以這樣編寫代碼:
from random import randomresults = []for x in range(10): results.append(int(round(random())))
或者使用列表生成式使代碼更簡潔:
from random import randomresults = [int(round(random())) for x in range(10)]
這里使用了range函數循環了10次。每一次我們都把random()的輸出進行四舍五入。因為random()函數返回一個0到1的浮點數,所以對輸出進行四舍五入就會返回0或者1。Round()函數返回一個浮點型數據,使用int()將其轉為整型并添加到列表里。
6 移除句子中的元音字母
假設你有一個句子,
sentence = 'Your mother was a hamster'
并且你想移除所有的元音字母。我們可以使用幾行代碼輕易做到:
vowels = 'aeiou'non_list = []for l in sentence: if not l in vowels: non_list.append(l)nonvowels = ''.join(non_list)
或者你可以使用列表生成式簡化它:
vowels = 'aeiou'nonvowels = ''.join([l for l in sentence if not l in vowels])
這個例子使用列表生成式創建一個字母列表,字母列表的字母來自sentence句子的非元音字母。然后我們把生成的列表傳給join()函數去轉換為字符串。
修正:正如reddit上的iamadogwhatisthis提出的,這個例子不需要列表生成式。使用生成器(generator)更好:
vowels = 'aeiou'nonvowels = ''.join(l for l in sentence if not l in vowels)
注意,這里去掉了方括號。這是因為join函數接收任意可迭代的數據,包括列表或者生成器。這個沒有方括號的語法使用了生成器。這產生(與列表生成式)同樣的結果,相對于之前把所有條目包裝成一個列表,生成器在我們遍歷時才產生相應的條目。這可以使我們不必保存整個列表到內存,并且這對于處理大量數據更有效率。
7 獲取目錄里的文件名列表
下面的代碼將會遍歷my_dir目錄下的文件,并在files里追加每個以txt為后綴的文件名。
import osfiles = []for f in os.listdir('./my_dir'): if f.endswith('.txt'): files.append(f)這同樣可以使用列表生成式簡化代碼:
import osfiles = [f for f in os.listdir('./my_dir') if f.endswith('.txt')]或者你可以獲取一個相對路徑的列表:
import osfiles = [os.path.join('./my_dir', f) for f in os.listdir('./my_dir') if f.endswith('.txt')]感謝reddit上的rasbt提供。
8 將csv文件讀取為字典列表
我們常常需要讀取和處理csv文件的數據。處理csv數據的一個最有用的方法就是把它轉換為一個字典列表。
import csvdata = []for x in csv.DictReader(open('file.csv', 'rU')): data.append(x)你可以使用列表生成式快速實現:
import csvdata = [ x for x in csv.DictReader(open('file.csv', 'rU'))]DictReader類將會自動地使用csv文件的第一行作為字典的key屬性名。DictReader類返回一個將會遍歷csv文件所有行的對象。這個文件對象通過open()函數產生。我們提供了open()兩個參數 主站蜘蛛池模板: 城固县| 南雄市| 丽水市| 镇江市| 徐汇区| 团风县| 隆化县| 泰州市| 哈尔滨市| 攀枝花市| 二连浩特市| 齐齐哈尔市| 罗甸县| 尚志市| 疏勒县| 呼伦贝尔市| 青州市| 太和县| 青河县| 海原县| 鹤岗市| 盐津县| 开原市| 五指山市| 顺昌县| 达州市| 苏尼特左旗| 高密市| 海宁市| 宜州市| 峡江县| 桃源县| 霍山县| 肇州县| 闸北区| 娄底市| 武清区| 温州市| 临汾市| 舒城县| 无极县|