>>> itertools インポート islice
から
>>> def n_grams(a, n):
... z = (islice(a, i, None) 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)]
14. 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()))
>>>ミ
{1: 'a'、2: 'b'、3: 'c'、4: 'd'}
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]
>>> [l の x の l の x]
[1、2、3、4、5、6]
>>> a = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
>>> [l1 の x、l1 の l2 、l2 の x]
[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) が list else [x]
>>> 平らにする(a)
[1、2、3、4、5、6、7、8]
注: Python のドキュメントによると、 itertools.chain.from_iterable が推奨されます。
16. ジェネレーター式
コードをコピー コードは次のとおりです:
>>> g = (xrange(10) の x には x ** 2)
>>>次(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
17. 辞書の反復
コードをコピー コードは次のとおりです:
>>> 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)}
>>>
{0: 'A0'、1: 'A1'、2: 'A2'、3: 'A3'、4: 'A4'、5: 'A5'、6: 'A6'、7: 'A7'、8 : 'A8', 9: 'A9'}
18. 辞書を反復処理して辞書を反転します
コードをコピー コードは次のとおりです:
>>> m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>>
{'d': 4、'a': 1、'b': 2、'c': 3}
>>> {v: k の k、m.items() の v}
{1: 'a'、2: 'b'、3: 'c'、4: 'd'}
19. 名前付きシーケンス (collections.namedtuple)
コードをコピー コードは次のとおりです:
>>> ポイント = collections.namedtuple('ポイント', ['x', 'y'])
>>> p = ポイント(x=1.0, y=2.0)
>>>p
点(x=1.0, y=2.0)
>>>x
1.0
>>>
2.0
20. 名前付きリストの継承:
コードをコピー コードは次のとおりです:
>>> クラス Point(collections.namedtuple('PointBase', ['x', 'y'])):
... __スロット__ = ()
... 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
点(x=3.0, y=5.0)
21. 収集および収集業務
コードをコピー コードは次のとおりです:
>>> A = {1, 2, 3, 3}
>>>A
set([1, 2, 3])
>>> B = {3, 4, 5, 6, 7}
>>>B
set([3, 4, 5, 6, 7])
>>>
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))
本当
22. マルチセットとその操作 (コレクション.カウンター)
コードをコピー
コードは次のとおりです:
>>> A = コレクション.カウンター([1, 2, 2])
>>> B = コレクション.カウンター([2, 2, 3])
>>>A
カウンター({2:2, 1:1})
>>>B
カウンター({2:2, 3:1})
>>>
カウンタ({2:2, 1:1, 3:1})
>>>A&B
カウンター({2:2})
>>>A+B
カウンター({2:4, 1:1, 3:1})
>>> A - B
カウンタ({1:1})
>>>B - A
カウンタ({3:1})
23. 反復で最も一般的な要素 (collections.Counter)
コードをコピー
コードは次のとおりです:
>>> 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)]
24. 両端キュー (collections.deque)
コードをコピー
コードは次のとおりです:
>>> Q = collections.deque()
>>> Q.append(1)
>>> Q.appendleft(2)
>>> Q.extend([3, 4])
>>> Q.extendleft([5, 6])
>>>質問
deque([6, 5, 2, 1, 3, 4])
>>> Q.pop()
4
>>> Q.popleft()
6
>>>質問
deque([5, 2, 1, 3])
>>> Q.回転(3)
>>>質問
deque([2, 1, 3, 5])
>>> Q.回転(-3)
>>>質問
deque([5, 2, 1, 3])
25. 最大長の Deque (collections.deque)
コードをコピー コードは次のとおりです:
>>> last_three = collections.deque(maxlen=3)
>>> 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
26. 辞書の並べ替え (collections.OrderedDict)
コードをコピー コードは次のとおりです:
>>> m = dict((str(x), x) for x in range(10))
>>> ', '.join(m.keys())
1、0、3、2、5、4、7、6、9、8
>>> m = collections.OrderedDict((str(x), x) for x in range(10))
>>> ', '.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))
>>> ', '.join(m.keys())
10、9、8、7、6、5、4、3、2、1
27.デフォルト辞書 (collections.defaultdict)
コードをコピー コードは次のとおりです:
>>> m = dict()
>>>['a']
トレースバック (最後の呼び出し):
ファイル「
」、1 行目、
キーエラー: 'a'
>>>
>>> m = collections.defaultdict(int)
>>>['a']
0
>>>m['b']
0
>>> m = collections.defaultdict(str)
>>>['a']
''
>>> m['b'] += 'a'
>>>m['b']
「あ」
>>> m = collections.defaultdict(lambda: '[デフォルト値]')
>>>['a']
'[デフォルト値]'
>>>m['b']
'[デフォルト値]'
28. デフォルトの辞書を使用して単純なツリーを表現します
コードをコピー コードは次のとおりです:
>>> json をインポート
>>> ツリー = ラムダ: collections.defaultdict(tree)
>>> ルート = ツリー()
>>> ルート['メニュー']['id'] = 'ファイル'
>>> root['メニュー']['値'] = 'ファイル'
>>> 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, separators=(',', ': '))
{
「メニュー」: {
"id": "ファイル",
「メニュー項目」: {
「閉じる」: {
"onclick": "close();",
"値": "閉じる"
},
"新しい": {
"onclick": "new();",
"値": "新規"
},
"開く": {
"onclick": "open();",
"値": "開く"
}
}、
"値": "ファイル"
}
}
(詳細については、https://gist.github.com/hrldcpr/2012250 を参照してください)
29. オブジェクトを一意のシーケンス番号にマッピングする (collections.defaultdict)
コードをコピー コードは次のとおりです:
>>> itertools、コレクションをインポートします
>>> value_to_numeric_map = collections.defaultdict(itertools.count().next)
>>> 数値マップ['a']
0
>>> 数値マップへの値['b']
1
>>> 数値マップ['c']
2
>>> 数値マップ['a']
0
>>> 数値マップへの値['b']
1
30. 最大要素と最小要素 (heapq.nlargest および heapq.nsmallest)
コードをコピー コードは次のとおりです:
>>> 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]
31. デカルト積 (itertools.product)
コードをコピー コードは次のとおりです:
>>> itertools.product([1, 2, 3], [4, 5]):
(1, 4)
(1, 5)
(2, 4)
(2, 5)
(3, 4)
(3, 5)
>>> itertools.product([0, 1],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
32. 組み合わせと組み合わせの置換 (itertools.combinations および itertools.combinations_with_replacement)
コードをコピー コードは次のとおりです:
>>> itertools.combinations([1, 2, 3, 4, 5], 3) の c:
... print ''.join(str(x) for x in c)
...
123
124
125
134
135
145
234
235
245
345
>>> itertools.combinations_with_replacement([1, 2, 3], 2) の c:
... print ''.join(str(x) for x in c)
...
11
12
13
22
23
33
33. 並べ替え (itertools.permutations)
コードをコピー コードは次のとおりです:
>>> itertools.permutations([1, 2, 3, 4]):
... 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
34. リンクの反復 (itertools.chain)
コードをコピー コードは次のとおりです:
>>> a = [1, 2, 3, 4]
>>> itertools.chain(itertools.combinations(a, 2), itertools.combinations(a, 3)) の p:
... 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, n) for 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)
35. 指定された値で行をグループ化する (itertools.groupby)
コードをコピー コードは次のとおりです:
>>> from オペレーター import itemgetter
>>> itertools をインポート
>>> infile として open('contactlenses.csv', 'r') を使用:
... data = [infile の行の line.strip().split(',')]
...
>>>データ = データ[1:]
>>> def print_data(行):
... print 'n'.join('t'.join('{:
...
>>> print_data(データ)
若い 近視 いいえ 減少しました なし
若い 近視 いいえ 普通 柔らかい
若い 近視 はい 減少しました なし
若い 近視 はい 普通 硬い
若い ハイパーメトロロープ いいえ 減少しました なし
若い ハイパーメトロロープ いいえ 普通 柔らかい
若い ハイパーメトロロープ はい 減少しました なし
若い ハイパーメトロロープ はい 普通 ハード
老視前 近視 いいえ 軽減 なし
老視前 近視 いいえ 普通 柔らかい
老視前 近視 はい 軽減 なし
老視前 近視 はい 普通 難しい
老視前 遠視 いいえ 軽減 なし
老視前 遠視 いいえ 普通 ソフト
老視前 遠視 はい 軽減 なし
老視前 遠視 はい 通常 なし
老眼 近視 なし 軽減 なし
老視 近視 いいえ 普通 なし
老視 近視 はい 軽減 なし
老眼 近視 はい 普通 難しい
老視 遠視 いいえ 軽減 なし
老視 遠視 いいえ 普通 ソフト
老視 遠視 はい 軽減 なし
老視 遠視 はい 普通 なし
>>> data.sort(key=itemgetter(-1))
>>>値の場合は、 itertools.groupby(data, lambda r: r[-1]):
のグループ
... print '-----------'
... print 'グループ: ' + 値
... print_data(グループ)
...
-----------
グループ: ハード
若い 近視 はい 普通 硬い
若い ハイパーメトロロープ はい 普通 ハード
老視前 近視 はい 普通 難しい
老眼 近視 はい 普通 難しい
-----------
グループ: なし
若い 近視 いいえ 減少しました なし
若い 近視 はい 減少しました なし
若い ハイパーメトロロープ いいえ 減少しました なし
若い ハイパーメトロロープ はい 減少しました なし
老視前 近視 いいえ 軽減 なし
老視前 近視 はい 軽減 なし
老視前 遠視 いいえ 軽減 なし
老視前 遠視 はい 軽減 なし
老視前 遠視 はい 通常 なし
老眼 近視 なし 軽減 なし
老視 近視 いいえ 普通 なし
老視 近視 はい 軽減 なし
老視 遠視 いいえ 軽減 なし
老視 遠視 はい 軽減 なし
老視 遠視 はい 普通 なし
-----------
グループ: ソフト
若い 近視 いいえ 普通 柔らかい
若い ハイパーメトロロープ いいえ 普通 柔らかい
老視前 近視 いいえ 普通 柔らかい
老視前 遠視 いいえ 普通 ソフト
老眼 遠視 いいえ 普通