zjp0633 发表于 2015-12-15 13:13:02

[译]40个你可能不知道的Python的特点和技巧

今天在别人的博客上看到一篇非常干货的文章,在此翻译过来分享给大家。。作者的前言介绍就不再赘述,直接上干货代码。。

    1、拆箱

>>> a, b, c = 1, 2, 3
>>> a, b, c
(1, 2, 3)
>>> a, b, c =
>>> 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 =
>>> a
1
>>> b
2
>>> c
3
>>> d
4

2、使用拆箱进行变量交换

>>> a, b = 1, 2
>>> a, b = b, a
>>> a, b
(2, 1)

3、扩展的拆箱(Python 3支持)

>>> a, *b, c =
>>> a
1
>>> b

>>> c
5

4、负数索引

>>> a =
>>> a[-1]
10
>>> a[-3]
8

5、列表切片(a)

>>> a =
>>> a


6、负数索引的列表切片

>>> a =
>>> a[-4:-2]


7、带步数的列表切片(a)

>>> a =
>>> a[::2]

>>> a[::3]

>>> a


8、负数步数的列表切片

>>> a =
>>> a[::-1]

>>> a[::-2]


9、列表切片赋值

>>> a =
>>> a =
>>> a

>>> a =
>>> a

>>> a = []
>>> a


10、切片命名(slice(start, end, step))

>>> a =
>>> LASTTHREE = slice(-3, None)
>>> LASTTHREE
slice(-3, None, None)
>>> a


11、遍历列表索引和值(enumerate)

>>> a = ['Hello', 'world', '!']
>>> for i, x in enumerate(a):
...   print '{}: {}'.format(i, x)
...
0: Hello
1: world
2: !

12、遍历字典的KEY和VALUE(dict.iteritems)

>>> m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> for k, v in m.iteritems():
...   print '{}: {}'.format(k, v)
...
a: 1
c: 3
b: 2
d: 4

# 注意:Python 3中要使用dict.items

13、压缩 & 解压列表和可遍历对象

>>> a =
>>> b = ['a', 'b', 'c']
>>> z = zip(a, b)
>>> z
[(1, 'a'), (2, 'b'), (3, 'c')]
>>> zip(*z)
[(1, 2, 3), ('a', 'b', 'c')]

14、使用zip分组相邻列表项

>>> a =

>>> # Using iterators
>>> group_adjacent = lambda a, k: zip(*( * 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,)]


>>> # Using slices
>>> from itertools import islice
>>> group_adjacent = lambda a, k: zip(*(islice(a, i, None, 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,)]

15、使用zip & iterators实现推拉窗(n-grams)

>>> from itertools import islice
>>> def n_grams(a, n):
...   z = (islice(a, i, None) for i in range(n))
...   return zip(*z)
...
>>> a =
>>> 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)]

16、使用zip反相字典对象

>>> 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'}

17、合并列表

>>> a = [, , ]
>>> list(itertools.chain.from_iterable(a))


>>> sum(a, [])


>>>


>>> a = [[, ], [, ]]
>>>


>>> a = , [, ]]
>>> flatten = lambda x: if type(x) is list else
>>> flatten(a)

Note: according to Python's documentation on sum, itertools.chain.from_iterable is the preferred method for this.

18、生成器

>>> g = (x ** 2 for x in xrange(10))
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> sum(x ** 3 for x in xrange(10))
2025
>>> sum(x ** 3 for x in xrange(10) if x % 3 == 1)
408

19、字典解析

>>> m = {x: x ** 2 for x in range(5)}
>>> m
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

>>> m = {x: 'A' + str(x) for x in range(10)}
>>> m
{0: 'A0', 1: 'A1', 2: 'A2', 3: 'A3', 4: 'A4', 5: 'A5', 6: 'A6', 7: 'A7', 8: 'A8', 9: 'A9'}

20、使用字典解析反相字典对象

>>> m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> m
{'d': 4, 'a': 1, 'b': 2, 'c': 3}
>>> {v: k for k, v in m.items()}
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}

21、命名的tuples(collections.namedtuple)

>>> Point = collections.namedtuple('Point', ['x', 'y'])
>>> p = Point(x=4.0, y=2.0)
>>> p
Point(x=4.0, y=2.0)
>>> p.x
4.0
>>> p.y
2.0

22、继承命名tuples

>>> class Point(collections.namedtuple('PointBase', ['x', 'y'])):
...   __slots__ = ()
...   def __add__(self, other):
...             return Point(x=self.x + other.x, y=self.y + other.y)
...
>>> p = Point(x=4.0, y=2.0)
>>> q = Point(x=2.0, y=3.0)
>>> p + q
Point(x=6.0, y=5.0)

23、Set & Set运算

>>> A = {1, 2, 3, 3}
>>> A
set()
>>> B = {3, 4, 5, 6, 7}
>>> B
set()
>>> A | B
set()
>>> A & B
set()
>>> A - B
set()
>>> B - A
set()
>>> A ^ B
set()
>>> (A ^ B) == ((A - B) | (B - A))
True

24、Multisets运算(collections.Counter)

>>> A = collections.Counter()
>>> B = collections.Counter()
>>> A
Counter({2: 2, 1: 1})
>>> B
Counter({2: 2, 3: 1})
>>> A | B
Counter({2: 2, 1: 1, 3: 1})
>>> A & B
Counter({2: 2})
>>> A + B
Counter({2: 4, 1: 1, 3: 1})
>>> A - B
Counter({1: 1})
>>> B - A
Counter({3: 1})

25、列表中出现最多的元素(collections.Counter)

>>> A = collections.Counter()
>>> A
Counter({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)]

26、双向队列(collections.deque)

>>> Q = collections.deque()
>>> Q.append(1)
>>> Q.appendleft(2)
>>> Q.extend()
>>> Q.extendleft()
>>> Q
deque()
>>> Q.pop()
4
>>> Q.popleft()
6
>>> Q
deque()
>>> Q.rotate(3)
>>> Q
deque()
>>> Q.rotate(-3)
>>> Q
deque()

27、限制长度的双向队列(collections.deque)

>>> last_three = collections.deque(maxlen=3)
>>> for i in xrange(10):
...   last_three.append(i)
...   print ', '.join(str(x) for x in last_three)
...
0
0, 1
0, 1, 2
1, 2, 3
2, 3, 4
3, 4, 5
4, 5, 6
5, 6, 7
6, 7, 8
7, 8, 9

28、排序字典(collections.OrderedDict)

>>> m = 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

29、默认字典(collections.defaultdict)

>>> m = dict()
>>> m['a']
Traceback (most recent call last):
File "", line 1, in
KeyError: 'a'
>>>
>>> m = collections.defaultdict(int)
>>> m['a']
0
>>> m['b']
0
>>> m = collections.defaultdict(str)
>>> m['a']
''
>>> m['b'] += 'a'
>>> m['b']
'a'
>>> m = collections.defaultdict(lambda: '')
>>> m['a']
''
>>> m['b']
''

30、使用defaultdict代表tree

>>> import json
>>> tree = lambda: collections.defaultdict(tree)
>>> root = tree()
>>> root['menu']['id'] = 'file'
>>> root['menu']['value'] = 'File'
>>> root['menu']['menuitems']['new']['value'] = 'New'
>>> root['menu']['menuitems']['new']['onclick'] = 'new();'
>>> root['menu']['menuitems']['open']['value'] = 'Open'
>>> root['menu']['menuitems']['open']['onclick'] = 'open();'
>>> root['menu']['menuitems']['close']['value'] = 'Close'
>>> root['menu']['menuitems']['close']['onclick'] = 'close();'
>>> print json.dumps(root, sort_keys=True, indent=4, separators=(',', ': '))
{
"menu": {
"id": "file",
"menuitems": {
"close": {
"onclick": "close();",
"value": "Close"
},
"new": {
"onclick": "new();",
"value": "New"
},
"open": {
"onclick": "open();",
"value": "Open"
}
},
"value": "File"
}
}

# 查看更多:https://gist.github.com/hrldcpr/2012250

31、映射对象到唯一的计数数字(collections.defaultdict)

>>> import itertools, collections
>>> value_to_numeric_map = collections.defaultdict(itertools.count().next)
>>> value_to_numeric_map['a']
0
>>> value_to_numeric_map['b']
1
>>> value_to_numeric_map['c']
2
>>> value_to_numeric_map['a']
0
>>> value_to_numeric_map['b']
1

32、最大 & 最小元素(heapq.nlargest and heapq.nsmallest)

>>> a =
>>> heapq.nsmallest(5, a)

>>> heapq.nlargest(5, a)


33、笛卡尔积(itertools.product)

>>> for p in itertools.product(, ):
(1, 4)
(1, 5)
(2, 4)
(2, 5)
(3, 4)
(3, 5)
>>> for p in itertools.product(, repeat=4):
...   print ''.join(str(x) for x in p)
...
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

34、组合(itertools.combinations and itertools.combinations_with_replacement)

>>> for c in itertools.combinations(, 3):
...   print ''.join(str(x) for x in c)
...
123
124
125
134
135
145
234
235
245
345
>>> for c in itertools.combinations_with_replacement(, 2):
...   print ''.join(str(x) for x in c)
...
11
12
13
22
23
33

35、排列(itertools.permutations)

>>> for p in itertools.permutations():
...   print ''.join(str(x) for x in p)
...
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321

36、链接可遍历对象(itertools.chain)

>>> a =
>>> 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)
>>> for subset in itertools.chain.from_iterable(itertools.combinations(a, n) for n in range(len(a) + 1))
...   print subset
...
()
(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)

37、根据给定的KEY分组(itertools.groupby)

>>> from operator import itemgetter
>>> import itertools
>>> with open('contactlenses.csv', 'r') as infile:
...   data =
...
>>> data = data
>>> def print_data(rows):
...   print '\n'.join('\t'.join('{:
页: [1]
查看完整版本: [译]40个你可能不知道的Python的特点和技巧