列表,字典,集合中根據條件篩選數據,如下所示
列表:[-10,2,2,3,-2,7,6,9] 找出所有的非負數
字典:{1:90,2:55,3:87...} 找出所有值大於60的鍵值對
集合:{2,3,8,6,7,5} 找出所有被3整除的數
列表
>>> from random import randint >>> data = [randint(-10,10) for x in xrange(10)] >>> data [-1, 8, -9, 9, 10, -2, 6, -8, -2, 10]
對於列表來說,想要對其中的數值進行篩選,最先想到的應該是利用遍歷:
>>> res = [] >>> for x in data: >>> if x >= 0: >>> res.apend(x)
>>> res
[8,9,10,6,10]
較為常用的方法還有使用過濾函數filter
>>> filter(lambda x: x >= 0, data)
[8,9,10,6,10]
也可以使用列表生成式
>>> [x for x in data if x >= 0] [8, 9, 10, 6, 10]
對比這三種方法,開發中通常使用第三種,列表生成式,因為它的運行效率要比過濾函數filter高,而對於第一種則不會去使用。
字典
假如現有20名同學,他們的序號和成績以對應形式的字典給出,如下所示:
>>> students = {x: randint(30, 100) for x in xrange(1, 21)} >>> students {1: 31, 2: 37, 3: 34, 4: 77, 5: 69, 6: 68, 7: 84, 8: 83, 9: 49, 10: 60, 11: 39, 12: 96, 13: 79, 14: 80, 15: 90, 16: 75, 17: 38, 18: 61, 19: 97, 20: 66}
現在要篩選出成績優秀(即80分以上)的同學。
使用字典解析:
>>> {k:v for k,v in students.iteritems() if v >= 80} {7: 84, 8: 83, 12: 96, 14: 80, 15: 90, 19: 97}
這個過程中,使用了students.iteritems()而不只是students,這是由於如果只遍歷students則只會得到鍵,而不會得到值。
集合
集合解析:
>>> data [-1, 8, -9, 9, 10, -2, 6, -8, -2, 10] >>> s = set(data) >>> s set([6, 8, 9, 10, -1, -9, -8, -2]) >>> {x for x in s if x % 3 == 0} set([9, 6, -9])