从我开始学习#wiki/1514.html” target=”_blank”>python时我就决定维护一个经常使用的“窍门”列表。不论何时当我看到一段让我觉得“酷,这样也行!”的代码时(在一个例子中、在stackoverflow、在开源码软件中,等等),我会尝试它直到理解它,然后把它添加到列表中。这篇文章是清理过列表的一部分。如果你是一个有经验的python程序员,尽管你可能已经知道一些,但你仍能发现一些你不知道的。如果你是一个正在学习python的c、c++或java程序员,或者刚开始学习编程,那么你会像我一样发现它们中的很多非常有用。
每个窍门或语言特性只能通过实例来验证,无需过多解释。虽然我已尽力使例子清晰,但它们中的一些仍会看起来有些复杂,这取决于你的熟悉程度。所以如果看过例子后还不清楚的话,标题能够提供足够的信息让你通过google获取详细的内容。
列表按难度排序,常用的语言特征和技巧放在前面。
1.15 摊平列表:
>>> a = [[1, 2], [3, 4], [5, 6]]
>>> list(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]
注意: 根据python的文档,itertools.chain.from_iterable是首选。
1.16 生成器表达式
>>> 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
1.17 迭代字典
>>> 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’}
1.18 通过迭代字典反转字典
>>> 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’}
1.19 命名序列 (collections.namedtuple)
>>> point = collections.namedtuple(‘point’, [‘x’, ‘y’])
>>> p = point(x=1.0, y=2.0)
>>> p
point(x=1.0, y=2.0)
>>> p.x
1.0
>>> p.y
2.0
1.20 命名列表的继承:
>>> 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=1.0, y=2.0)
>>> q = point(x=2.0, y=3.0)
>>> p + q
point(x=3.0, y=5.0)
1.21 集合及集合操作
>>> a = {1, 2, 3, 3}
>>> a
set([1, 2, 3])
>>> b = {3, 4, 5, 6, 7}
>>> b
set([3, 4, 5, 6, 7])
>>> a | b
set([1, 2, 3, 4, 5, 6, 7])
>>> a & b
set([3])
>>> a – b
set([1, 2])
>>> b – a
set([4, 5, 6, 7])
>>> a ^ b
set([1, 2, 4, 5, 6, 7])
>>> (a ^ b) == ((a – b) | (b – a))
true
1.22 多重集及其操作 (collections.counter)
>>> a = collections.counter([1, 2, 2])
>>> b = collections.counter([2, 2, 3])
>>> 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})
1.23 迭代中最常见的元素 (collections.counter)
>>> a = collections.counter([1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 6, 7])
>>> 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)]
1.24 双端队列 (collections.deque)
>>> q = collections.deque()
>>> q.append(1)
>>> q.appendleft(2)
>>> q.extend([3, 4])
>>> q.extendleft([5, 6])
>>> q
deque([6, 5, 2, 1, 3, 4])
>>> q.pop()
4
>>> q.popleft()
6
>>> q
deque([5, 2, 1, 3])
>>> q.rotate(3)
>>> q
deque([2, 1, 3, 5])
>>> q.rotate(-3)
>>> q
deque([5, 2, 1, 3])
1.25 有最大长度的双端队列 (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
1.26 字典排序 (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
1.27 缺省字典 (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: ‘[default value]’)
>>> m[‘a’]
‘[default value]’
>>> m[‘b’]
‘[default value]’
1.28 用缺省字典表示简单的树
>>> 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查看详情)
1.29 映射对象到唯一的序列数 (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
以上就是必看的的30个python语言的特点技巧(2) 的详细内容,更多请关注 第一php社区 其它相关文章!