web-dev-qa-db-ja.com

ネストされたリストのスライス

私はスライスに精通していて、これに頭を包むことができず、何が起こっているのかを説明するためにいくつかの値を変更しようとしましたが、それは私には意味がありません。

とにかく、ここに例があります:

l = [[0, 0, 0], [0, 1, 0], [1, 0, 0], [1, 1, 1]]  
print l[:,0:2]

その結果:

[[0, 0], [0, 1] [1, 0], [1, 1]]

私はこれを「インデックス0から0,2にスライスし、2ずつインクリメントする」と翻訳しようとしていますが、これは私には意味がありません。

16
prelic

あなたがしているのは基本的に多軸スライスです。 lは2次元のリストであり、2番目の次元をスライスしたいので、コンマを使用して次の次元を示します。

, 0:22番目の次元の最初の2つの要素を選択します。

本当にいい説明があります ここ 。私が最初にそれについて学んだとき、それが物事をよく明確にしたことを覚えています。

15
GWW

'l'がnumpy配列の場合にのみ、私が言ったように機能します。通常のリストとしての「l」の場合、エラーが発生します(Python 3.6):

>>> l
[[0, 0, 0], [0, 1, 0], [1, 0, 0], [1, 1, 1]]
>>> print (l[:,0:2])

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not Tuple

>>> l=np.array(l)
>>> l
array([[0, 0, 0],
       [0, 1, 0],
       [1, 0, 0],
       [1, 1, 1]])
>>> print (l[:,0:2])
[[0 0]
 [0 1]
 [1 0]
 [1 1]]
>>> 
3
JC Cheloven

以下は通常のリストで機能するはずです。それがリストのリストであり、すべてのサブリストが同じ長さであると仮定すると、これを行うことができます(python 2)

A = [[1, 2], [3, 4], [5, 6]]
print (f"A = {A}")

flatA = sum(A, [])     # Flattens the 2D list
print (f"flatA = {flatA}")
len0 = len(A[0])
lenall = len(flatA)
B = [flatA[i:lenall:len0] for i in range(len0)] 
print (f"B = {B}")

出力は次のようになります。

A = [[1, 2], [3, 4], [5, 6]]
flatA = [1, 2, 3, 4, 5, 6]
B = [[1, 3, 5], [2, 4, 6]]
0
Richard Hartley