各要素がスペースで区切られたn要素の長さが必要だとします。さらに、i 番目の要素を a1
にし、残りをa にする必要があり0
ます。これを行う最も簡単なpythonicの方法は何ですか?
したがって、もしn = 10
、そしてi = 2
、私が望むだろう
0 1 0 0 0 0 0 0 0 0
C ++で取得できるaのようなものが欲しいnew string[]
のですが、Pythonバージョンは私を避けています。
ありがとう!
リストを使用します。
n = 10
i = 2
mylist = ["0"] * n
mylist[i-1] = "1"
print " ".join(mylist)
次のPythonジェネレータ式は、探しているものを生成するはずです。
" ".join("1" if i == (x+1) else "0" for x in range(n))
Python REPL からの次の例が役に立ちます。Python ジェネレーター式" ".join(bin((1<<n)+(1<<n>>i))[3:])
が解決策になるはずです。
>>> n=10
>>> i=2
>>> " ".join(bin((1<<n)+(1<<n>>i))[3:])
'0 1 0 0 0 0 0 0 0 0'
これは宿題のように見えるので、Pythonではなく英語で答えを説明します。
リスト内包表記を使用して文字列のリストを作成し、(アイテムのインデックスが)および(それ以外の場合)のn
いずれかから各要素を選択します。リストの要素をスペースで結合します。'1'
i
'0'
ブール値に基づいて2つのアイテムから選択する方法はいくつかあります。それらの1つは、シーケンスに2つの項目を持ち、ブール値でシーケンスにインデックスを付けることです。したがって、の場合は最初の要素False
を、。の場合は2番目の要素を選択しますTrue
。この特定のケースでは、ブール値をいくつかの方法に、'0'
または'1'
いくつかの方法で変換することもできます(たとえば、整数に変換してから文字列に変換します)。
new string[]
コメントがわかりません。これはC++構文ではありません。
編集
Pythonは次のとおりです。
' '.join([('0', '1')[x == i - 1] for x in range(n)])
また
' '.join([str(int(x == i - 1)) for x in range(n)])
私は前者がもっと好きです-それが0と1を生成することは非常に明白であり、それらは簡単に他のものに変更することができます。1ベースと0ベースになるように調整するのではありませi - 1
ん。通常、私はそれをしません。すべてが同じであれば、入力形式と出力形式で1ベースの値が必要な場合を除いて、全体を通してゼロベースのインデックスを使用することを好みます。その場合、私は入力をできるだけ早く変換し、出力をできるだけ遅くし、コードの同じビットに2つを混在させないようにします。i
i
x
角かっこを安全にドロップして、リスト内包をジェネレーター内包に変えることができます。ほとんどの意図と目的のために、それらは同じように機能します。
文字列を結合するには、「+」を使用するだけです。
("0 "*i + "1 " + "0 "*(n-i-1))[:-1]
または、bytearrayを使用することもできます。
a = bytearray(("0 "*n)[:-1])
a[i*2] = "1"
print str(a)