必看的的30个python语言的特点技巧(2)

从我开始学习#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社区 其它相关文章!

Posted in 未分类

发表评论