[0 for y in x]
と書いてしまうと全ての要素が0になってしまいますので、0
の代わりに順序数を0, 1, 2, ...のように順番に列挙してくれるイテレーターを用い、それに対して次々にnext(iterator)
として値を取り出す方法が思いつきます。
あらかじめaの全ての要素の個数の程度がわかっていれば、
例1:
Python
1a = [[1], [6, 17], [0]]
2iterator = range(100)
3b = [[next(iterator) for _ in e] for e in a]
などと書けます。一応許容範囲内のコードとは思いますが、「100というなんだかよくわからない数(プログラミングではマジックナンバーなんて言い方をします)」がコードに出現している点がイマイチです。
もうすこしきちんと書くならaの要素数を数えるべきでしょう。
例2:
Python
1a = [[1], [6, 17], [0]]
2n = sum(map(len, a))
3iterator = range(n)
4b = [[next(iterator) for _ in e] for e in a]
しかしiteratorが「無限に数列を列挙してくれる」ならaの要素数を気にする必要はなくなりますので、rangeの代わりに自前でジェネレーターを定義する方法もアリだと思います。
例3:
python
1a = [[1], [6, 17], [0]]
2
3def ordinal():
4 i = 0
5 while True:
6 yield i
7 i += 1
8
9iterator = ordinal()
10b = [[next(iterator) for _ in e] for e in a]
ただ短いとは言え関数定義を伴うので例2ぐらいがいいのでしょうか・・・個人的には例3が好みです。
追記: LouiS0616さんがコメントくださったように、例3のordinalの汎用版が標準ライブラリー(itertools.count)にありました!ということで、単に次のように書くのが自然だと思います。
python
1import itertools
2
3a = [[1], [6, 17], [0]]
4iterator = itertools.count()
5b = [[next(iterator) for _ in e] for e in a]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/30 00:07
2019/04/30 01:48