-1

この手順の考え方は、「正方形」(リストのリスト) を変換して向きを変えることです。たとえば、「四角」を入力して

[[1,2,3]、[1,2,3]、[1,2,3]]

プロシージャは戻る必要があります

[[1,1,1]、[2,2,2]、[3,3,3]]

def turn_square(list4)
  n_index = [0,1,2]
  turned = []
  blank = []
  turned_i = 0
  for k in n_index:
    turned.append(blank)
  for i in n_index:
    for j in n_index:
      turned[turned_i].append(list4[j][i])
    turned_i = turned_i + 1

しかし、なぜだかわかりませんが、それは戻ってきています

[[1, 1, 1, 2, 2, 2, 3, 3, 3], [1, 1, 1, 2, 2, 2, 3, 3, 3], [1, 1, 1, 2, 2、2、3、3、3]]

理由はありますか?助けてください。

4

3 に答える 3

6
zip(*square)

動作するはずです... 2次元配列を転置します

>>> square = [[1,2,3],[1,2,3],[1,2,3]]
>>> zip(*square)
[(1, 1, 1), (2, 2, 2), (3, 3, 3)]

1つの注意点は、これによりタプルのリストが作成されることです...これにより、タプルは変更できなくなります...しかし、高速になります

于 2012-07-14T19:06:12.323 に答える
3

私はzip自分自身を使用しますが、コードの根本的な問題は次のとおりです。

blank = []
[...]
for k in n_index:
    turned.append(blank)

おそらく、これにより新しい空のリストが追加されると思われるため、turned には 3 つの空のリストが含まれます。しかし、代わりに、同じ空のリストに 3 つの参照を追加するため、1 つの参照に対して行うことはすべて、それらの「すべて」に適用されます (実際には 1 つしかないため、「すべて」は引用符で囲まれています)。

>>> blank = []
>>> a = [blank, blank]
>>> a
[[], []]
>>> a[0].append("fred")
>>> a
[['fred'], ['fred']]

それらはメモリ内の同じオブジェクトです。

>>> a[0] is a[1]
True

新しいリストを作成するようにコードを変更すると[そして追加return turned]、つまり

    turned.append([])

それは動作します:

>>> x = [[1,2,3], [1,2,3], [1,2,3]]
>>> x
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>> x = turn_square(x)
>>> x
[[1, 1, 1], [2, 2, 2], [3, 3, 3]]
>>> x = turn_square(x)
>>> x
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

[私は他のエラー テストを行っていないので、まだ正しくない可能性がありますが、これはあなたが見た奇妙な症状を説明しています。]

于 2012-07-14T19:13:55.667 に答える
0

これは数値データのように見えます。目的によっては、numpy 配列データ型 (および転置操作) が必要な場合があります。これにより、パフォーマンスが向上します。これは、大規模なデータセットにとって重要になる可能性があります。

ただし、これを python リストとして絶対に保持する必要がある場合 (リストにテキスト データと数値データが混在している場合など)、および上記のタプル ソリューションがニーズを満たさない場合 (編集のためにさらに操作を行う必要がある場合など)結果は後で配置します)、ネストされたリスト内包表記を試すことができます。

>>> data = [[1,2,3],[1,2,3],[1,2,3]]

>>> [ [ j[i] for j in data ] for i in range( len(j) ) ]
[[1, 1, 1], [2, 2, 2], [3, 3, 3]]
于 2012-07-14T19:50:14.397 に答える