從我開始學習python的時候,我就開始自己總結一個python小技巧的集合。後來當我什麼時候在Stack Overflow
或是在某個開源軟體裡看到一段很酷程式碼的時候,我就很驚訝:原來還能這麼做! ,當時我會努力的自己嘗試這段程式碼,直到我懂了它的整體思路以後,我就把這段程式碼加到我的集合裡。這篇部落格其實就是這個集合整理後一部分的公開亮相。如果你已經是個python大牛,那麼基本上你應該知道這裡面的大多數用法了,但我想你應該也能發現一些你不知道的新技巧。而如果你之前是一個c,c++,java的程式設計師,同時在學習python,或者乾脆就是一個剛學習程式設計的新手,那麼你應該會看到很多特別有用能讓你感到驚奇的實用技巧,就像我當初一樣。
每一個技巧和語言用法都會在一個個實例中展示給大家,也不需要有其他的說明。我已經盡力把每個例子弄的通俗易懂,但是因為讀者對python的熟悉程度不同,仍然可能難免有一些晦澀的地方。所以如果這些例子本身無法讓你讀懂,至少這個例子的標題會在你後面去google搜尋的時候幫你。
整個集合大概是依照難易度排序,簡單常見的在前面,比較少見的在最後。
1.1 拆箱
>>> a, b, c = 1, 2, 3
>>> a, b, c
(1, 2, 3)
>>> a, b, c = [11 , 2, 3]
>>> a, b, c
(1, 2, 3)
>>> a, b, c = (2 * i + 1 for i in range(3))
>>> a, b, c
(1, 3, 5)
>>> a, (b, c), d = [1, (2, 3), 4]
>>> a
1
>>> b
2
>>> c
3
>>> d
4
1.2 拆箱變數交換
>>, b a
>>> a, b
(2, 1)
>>> a
1
>>> b
[2, 3, 4]
>>> c
5
1.4 負數索引
2, 3, 4, 5, 6, 7, 8, 9, 10]>>> a[-1]
10
>>> a[-3]
8
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a[2:8][2, 3, 4, 5, 6, 7]
1.6 負數索引切割清單
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[7, 8]
1.7指定步長切割清單
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a[::2][0, 2, 4, 6, 8, 10]
>>> a[::3][0, 3, 6, 9]
>>> a[2 :8:2]
[2, 4, 6]
1.8 負數步長切割清單
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a[::-2][ 10, 8, 6, 4, 2, 0]
1.9 列表切割賦值
>>> a = [1, 2, 3, 4, 5]
>>> a
[1, 2, 0, 0, 4, 5]>>> a[1:1] = [8, 9]
>>> a
[1, 8, 9 , 2, 0, 0, 4, 5]
>>> a[1:-1] = []
>>> a
[1, 5]
>
1.10 命名清單切割方式
> = [0, 1, 2, 3, 4, 5]
>>> LASTTHREE
slice(-3, None, None)>>> a[LASTTHREE]
[3, 4, 5]
1.11 列表以及迭代器的壓縮和解壓縮
>>> a = [1, 2, 3]
>>> z = zip(a, b)
>>> z[(1, 'a'), (2, 'b'), (3, 'c')]
>>> zip(*z)
[(1, 2, 3), ('a', 'b', 'c')]
1.12 列表相鄰元素壓縮器
>>>> a = [1, 2, 3, 4, 5, 6]
>>>> zip(*([iter(a)] * 2))
[(1, 2), (3, 4), (5, 6)]
>>>> group_adjacent = lambda a, k: zip(*([iter(a)] * k))
>>>> group_adjacent(a, 3)
[( 1, 2, 3), (4, 5, 6)]
>>>> group_adjacent(a, 2)
[(1, 2), (3, 4), (5, 6)]
>>> > group_adjacent(a, 1)
[(1,), (2,), (3,), (4,), (5,), (6,)]
>>>>> zip(a[ ::2], a[1::2])
[(1, 2), (3, 4), (5, 6)]
>>>> zip(a[::3], a[ 1::3], a[2::3])
[(1, 2, 3), (4, 5, 6)]
>>>>> ; group_adjacent = lambda a, k: zip(* (a[i::k] for i in range(k)))
>>>> group_adjacent(a, 3)
[(1, 2, 3), (4, 5, 6)]
>>> > group_adjacent(a, 2)
[(1, 2), (3, 4), (5, 6)]
>>>> group_adjacent(a, 1)
[(1,), (2,), (3,), (4,), (5,), (6,)]
凡
1.13 在列表中用壓縮器和迭代器滑動取值視窗
>>>> def n_grams(a , n):
... z = [iter(a[i:]) for i in range(n)]
... return zip(*z)
...
>> > a = [1, 2, 3, 4, 5, 6]
>>>> n_grams(a, 3)
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)]
>>>>> n_grams(a, 2)
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
>>>>> n_grams(a, 4)
[(1, 2, 3, 4), (2, 3, 4, 5), (3, 4, 5, 6)]
凡
1.14 使用壓縮反器轉字典
>> m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>>> m.items()
[('a', 1), ('c', 3), ('b', 2), ('d', 4)]
>>>>> zip(m.values(), m.keys ())
[(1, 'a'), (3, 'c'), (2, 'b'), (4, 'd')]
> ;>> mi = dict(zip(m. values(), m.keys()))
>>>> mi
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}
1.15 列表展開
>>>> a = [[1, 2], [3, 4], [5, 6]]
>>>>列表(itertools.chain.from_iterable(a))
[1, 2, 3, 4, 5, 6]
>>>>> sum(a, [])
[1, 2, 3, 4, 5, 6]
>>>> [x for l in a for x in l ]
[1, 2, 3, 4, 5, 6]
>>>> a = [[[1, 2], [3, 4]], [[5, 6], [7, 8] ]]
>>>> [x for l1 in a for l2 in l1 for x in l2]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> a = [1, 2, [3, 4], [[5, 6], [7, 8]]]
>>>> flatten = lambda x: [y for l in x for y in flatten(l)] if type(x ) is list else [x]
>>>>> flatten(a)
[1, 2, 3, 4, 5, 6, 7, 8]
>>>> g = (x ** 2 for x in xrange(10))
>>>>下一個(g)
0
>>下一個(g)
1
>>>>下一個( g)
4
>>>>下一個(g)
9
>>> sum(x ** 3 for x in xrange(10))
2025
>>>> sum(x ** 3 for x in xrange(10) if x % 3 == 1)
408
>>>>> m = {x: x ** 2 for x in range(5)}
>>>> m = {x: x ** 2 for x in range(5)}
>>>> >米
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>>> m = {x: 'A' + str(x) for x in range(10) }
>>>> m
1.18 使用字典推導食品字典
>>>> m = {'a': 1, 'b': 22 , 'c': 3, 'd': 4}
>>>> m
{'d': 4, 'a': 1, 'b': 2, 'c': 3}
>>>> {v: k for k, v in m.items()}
凡
1.19 命名元群
>>>> Point = collections.namedtuple('Point', ['x', 'y'])
>>>> p = 點(x=1.0, y=2.0)
>>>> p
點(x=1.0, y=2.0)
>>>> p.x
1.0
>>>> p.y
🎜1.20 🎜🎜🎜 🎜🎜1.20 🎜🎜🎜 🎜🎜1.20 🎜🎜🎜 🎜🎜1.20 🎜 替換元組
>>>> class Point(collections.namedtuple('PointBase', ['x', 'y'])):
... __slots__ = ()
... def __add__(self, other):
... def __add__(self, other):
. .. return Point( x=self.x + other.x, y=self.y + other.y)
...
>>>> p = 點(x=1.0, y=2.0)
>>>> > q = 點(x=2.0, y=3.0)
>>>> p + q
Point(x=3.0, y=5.0)
>>>> A
set([1, 2, 3])
>>>>> B = {3, 4, 5, 6, 7}
>>> > B
set([3, 4, 5, 6, 7])
>>>>>一個| B
set([1, 2, 3, 4, 5, 6, 7])
>>>> > A & B
套裝([3])
>>> A - B
set([1, 2])
>>>> B - A
集合([4, 5, 6, 7])
> >>>> A ^ B
set([1, 2, 4, 5, 6, 7])
>>>> (A ^ B) == ((A - B) | (B - A))
True
>>>> B = collections.Counter([2, 2, 3])
>>>> B = collections.Counter([2, 2, 3])
>>>> A
計數器({2: 2, 1: 1})
>>>> B
計數器({2: 2, 3: 1})
>>一個| B
計數器({2: 2 , 1: 1, 3: 1})
>>>>> A & B
櫃檯({2: 2})
>>>> A + B
計數器({2: 4, 1: 1, 3: 1})
>>>> A - B
計數器({1: 1})
>>>>> B - A
Counter({3: 1})
1.23 統計在可迭代器中最常出現的元素
>>>>> A = collections.Counter([1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 6, 7])
>>>> > A
計數器({3: 4, 1: 2, 2: 2, 4: 1, 5: 1, 6: 1, 7: 1})
>>>>> A.most_common(1)
[( 3, 4)]
>>>>> A.most_common(3)
[(3, 4), (1, 2), (2, 2)]
1.24 端點都可操作的隊列
1.24 端點都可操作的隊列
1.24 端點都可操作的隊列
1.24 端點都可操作的隊列
>>>>> Q = collections.deque()
>>>> Q.append(1)
>>>> Q.appendleft(2)
>>>> Q.extend([3, 4 ])
>>>> Q.extendleft([5, 6])
>>>>> Q
雙端隊列([6, 5, 2, 1, 3, 4])
>>>>> Q. pop()
>>>> Q.popleft()
6>>>> Q
雙端隊列([5, 2, 1, 3])>>>>> Q.旋轉(3)
>>> Q
雙端隊列([2, 1, 3, 5])
>>>>> Q.旋轉(-3)
>>> Q
deque([5, 2, 1, 3] )
1.25 雙端隊列有最大長度
>>>> last_two = collections.deque(maxlen=3)
>>>> for i in xrange(10):
...
>>> for i in xrange(10):
... PRint ', '.join(str(x) for x in last_ Three)
...0
0, 10 , 1, 2
1, 2, 32, 3, 4
3, 4, 5
4, 5, 6
5, 6, 7
6, 7, 8
7, 8, 9
1.26 可排序
> = dict((str(x), x) for x in range(10))>>>> print ', '.join(m.keys())
1, 0, 3, 2, 5, 4, 7, 6, 9, 8>>>> m = collections.OrderedDict((str(x), x) for x in range(10))
>>>> print ', '.join(m.keys( ))0, 1, 2, 3, 4, 5, 6, 7, 8, 9
>>>> m = collections.OrderedDict((str(x), x) for x in range(10, 0, -1))
>>>> print ', '.join(m.keys())
10, 9, 8, 7, 6, 5, 4, 3, 2, 1
2
1.預設搜尋
>>> ; m = dict()
>>>> m['a']
回溯(最近一次呼叫):
檔案“
KeyError : 'a'
>>>
>> > m = collections.defaultdict(int)
>>>> m['a']
0
>>>> m['b']
0
>>>> m['a']
''>>>> m['b'] += 'a'
>>>> m['b'] 🎜'a'🎜>>>> m = collections.defaultdict(lambda: '[預設值]')🎜>>>> m['a']🎜'[預設值]'🎜>>>>> m[ 'b']🎜'[預設值]'🎜🎜🎜凡🎜🎜1.28預設字典的簡單樹狀表達式🎜>>>>導入json
>>>>樹= lambda: collections.defaultdict(tree)
>>>> root = 樹()
>>> root['menu']['id'] = '文件'
>>>> root['menu']['value'] = '檔案'
>>>> root['menu']['menuitems']['new']['value'] = '新'
>>>> root['menu']['menuitems']['new']['onclick'] = 'new();'
>>>> root['menu']['menuitems'] ['open']['value'] = '打開'
>>>> root['menu']['menuitems']['open']['onclick'] = 'open();'
>> >> root['menu']['menuitems']['close']['value'] = '關閉'
>>>> root['menu']['menuitems']['close'][' onclick'] = 'close();'
>>>> print json.dumps(root, sort_keys=True, indent=4,分隔符號=(',', ': '))
{
「選單」: {
“id”: “文件”,
“menuitems”: {
“close”:{
「value」:「關閉」
},
},
{
“onclick”:「new();”,
「值 「開」: {
「onclick」: “open();”,
「value」: 「開啟」
}
},
「值」:「檔案」
}的映射
>>>>導入itertools、集合
>>>> value_to_numeric_map['a']
0>>>>> value_to_numeric_map['b']
1>> valueue']>[ovalue.
2>>>> value_to_numeric_map['a']
0>>>> value_to_numeric_map['b']
1
> > a = [random.randint(0, 100) for __ in xrange(100)]
>>>> heapq.nsmallest(5, a)
[3, 3, 5, 6, 8]
>>>> heapq.nlargest(5, a)
[100, 100, 99, 98, 98]
> , 3], [4, 5]) 中的p:
(1, 4)
(1, 5)
(2, 4)
(2, 5)
(3, 5)
>>>> for p in itertools.product([0, 1], Repeat=4):... print ''.join(str(x) for x in p)
...00000
00010010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1和.32列表組合元素列表替代組合
>> for c in itertools.combinations([1, 2, 3, 4, 5], 3):
... print ''.join(str(x) for x in c)
...
123
124
125
134
135
145
234
245
345>>>>> for c in itertools.combinations_with_replacement([1, 2, 3], 2.ools.combinations_with_replacement([1, 2, 3], 2):hi . ) for x in c)
...11
1213
22
23
33
凡
1.33 列表元素排列組合
>>>>> for p in itertools.permutations([1, 2, 3, 4]):
... print ''.join(str(x) for x in p)
...
1234
1243
1324
1342
14233143323413332321333232323323323323323323323333323333333 2341
2413
2431
3124
3142
3214
3412
34214123214 13213413321341333213333333333333333333333333人
凡
1.34可連結迭代器
>>>>> a = [1, 2, 3, 4]
>>>> for p in itertools.chain(itertools.combinations(a, 2), itertools.combinations(a, 3)):
.. . print p
...
(1, 2)
(1, 3)
( 1, 4)
(2, 3)
(2, 4)
(3, 4)
(1, 2, 3 )
(1, 2, 4)
(1, 3, 4)
(2, 3, 4)
>>>>對於itertools.chain.from_iterable(itertools.combinations(a, nfor) 中的子集n in range(len(a) + 1))
... 印子集
...
()
(1,)
( 2,)
(3,)
(4,)
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
(1, 2, 3)
(1, 2, 4)
( 1, 3, 4)
(2, 3, 4)
(1, 2, 3, 4)
1.35 依檔案指定列類聚
>>>>導入itertools
>>>> with open('contactlenses.csv', 'r') as infile:
... data = [line.strip().split(',') for line infile ]
...
>>> ;資料= 資料[1:]
>>>> def print_data(rows):
... print 'n'.join('t'.join('{: ...
>>>> print_data(data)
年輕 近視 沒有 減少 無
年輕 近視 沒有 正常 軟
年輕 近視 是 減少 沒有
年輕 近視 是 遠視 沒有 減 沒有 正常 軟
保護 減少 無
年輕 遠 老花眼 否 化 無 正常 軟性
前老花眼 減少 無
前老花眼 是 正常 硬
前老花眼 遠視眼 否 減少 無
前老花眼 遠視 無 正常 柔和
前老花眼 是 減少 無
前老花眼 遠視眼 是 正常 沒有
老花眼 近視 沒有 減少 無
老花眼 沒有 下使用 是 減少 正常 硬
老花眼 減少 無
老花眼 遠視 軟
老花眼 遠視眼 是 遠視眼 是 正常 .sort(key=lambda r: r[-1])
>>>>對於值,在itertools.groupby(data, lambda r: r[-1]):
... print '----- ------'
... print 'Group: ' + value
... print_data(group)
...
-----------
組:硬
年輕 正常 硬
年輕 遠視 硬
前老花 近視 是 是 正常 近視 沒有 與 是 減少沒有
年輕 遠視 沒有 遠視 是 減 沒有減少 沒有
前老花眼 是 前老花眼 是 減 無 正常 無
老花眼 無近視 沒有
老花眼 近視 沒有
老花眼 近視 是 遠視眼 沒有 減少 減少無
老花眼 遠視 是 近視 沒有 遠視 正常 正常 軟
前老花眼 為遠視時沒有
老花遠視 無 正常 中使用網(m.sbmmt.com)!