37

リストがあるとします:

a=[1,2,3,4,5]  

このリストをタプルに変換したいと思います。私は、次のようなコーディングができると思いました:

state=()  
for i in a:  
    state=state+i

そしてそれはエラーを出しました。整数とタプルを連結しようとしている理由は明らかです。

しかし、タプルには、挿入や追加など、リストと同じ機能はありません。では、ループを介して要素を追加するにはどうすればよいでしょうか? 辞書も同じで、ミッシングリンクがあるように感じます。

4

7 に答える 7

6
>>> a = [1,2,3,4,5]
>>> tuple(a)
(1, 2, 3, 4, 5)
于 2012-05-05T06:06:30.773 に答える
1

一般化されたソリューションが必要な場合は、新しいリストを作成し、終了したらそれをタプルに変換するだけです。

Josia と byron の回答で提供されているソリューションを使用して、タプルを段階的に構築できますが、それでは反復ごとに新しいタプルが作成されます。変換するリストが大きい場合、インタープリターがコピーする必要があるため、非常に非効率的です。 O(n^2) 操作を必要とするすべての反復で、古いタプルから新しいタプルまでのすべての要素。

これはリストでは発生しません.Pythonは、追加する場合に備えて、リストの要素を格納するために必要な量よりも多くのメモリを実際に割り当てるためです。少なくとも、そのメモリが不足し、Python がさらにメモリを割り当てなければならないまでは、必要ありません。次に、大量のメモリを割り当て、すべての要素を新しい場所に移動しますが、この新しいメモリは、リストの要素を格納するのに必要なサイズよりも大きくなります。この方法でリストを作成するには、O(n) 操作が必要なだけなので、推奨されます。

于 2016-06-21T17:03:53.880 に答える
0

柔軟なテンソル形状を使用して C/NN を構築する際に同様の問題が発生した後、この問題に対する最も一般的な解決策を構築したと思います。

def cat(*args):
  x = ()
  for a in args:
    if type(a) is tuple:
      x+=a
    elif type(a) in {list,numpy.ndarray}:
      x+=tuple(a)
    else:
      x+=(a,)
  return tuple(x)

デモ:

In [0]: cat(1,(1,2),(3,4),[1,2],2)
Out[0]: (1, 1, 2, 3, 4, 1, 2)

これが悪いpythonかどうかわからない、私は新しいです:)

于 2016-07-05T04:20:55.887 に答える