Pythonで次のことができますか?
array = [0, 10, 20, 40]
for (i = array.length() - 1; i >= 0; i--)
配列の要素が必要ですが、最後から最初までです。
これには reversed
関数を使用できます。
>>> array=[0,10,20,40]
>>> for i in reversed(array):
... print(i)
reversed(...)
はリストを返さないことに注意してください。あなたはlist(reversed(array))
を使って逆のリストを得ることができます。
>>> L = [0,10,20,40]
>>> L[::-1]
[40, 20, 10, 0]
拡張スライスの構文はPythonでよく説明されています リリースの新しいエントリ2.3.5
コメントの中の特別な要望により これが最新のスライスドキュメントです 。
>>> L = [0,10,20,40]
>>> L.reverse()
>>> L
[40, 20, 10, 0]
または
>>> L[::-1]
[40, 20, 10, 0]
これはリストを複製することです。
L = [0,10,20,40]
p = L[::-1] # Here p will be having reversed list
これはその場でリストを逆にするためです。
L.reverse() # Here L will be reversed in-place (no new list made)
私はPythonでリストを逆にする最善の方法はそうすることだと思います:
a = [1,2,3,4]
a = a[::-1]
print(a)
>>> [4,3,2,1]
仕事は完了です、そして今、あなたは逆のリストを持っています。
同じリストを元に戻すには:
array.reverse()
逆のリストを他のリストに割り当てるには、次のようにします。
newArray = array[::-1]
スライシングを使うarray = array [:: - 1]はきちんとしたトリックで非常にPythonicですが、初心者にとっては少しあいまいです。 reverse()メソッドを使用するのは読みやすいので、毎日のコーディングをするのに良い方法です。
ただし、インタビューの質問のようにリストを元の位置に戻す必要がある場合は、これらのような組み込みメソッドを使用できない可能性があります。インタビュアーは、Pythonの知識の深さではなく、あなたがどのように問題に取り組むのかを見ていくでしょう。アルゴリズム的なアプローチが必要です。次の例は、古典的なスワップを使用して、それを行うための一つの方法かもしれません: -
def reverse_in_place(lst): # Declare a function
size = len(lst) # Get the length of the sequence
hiindex = size - 1
its = size/2 # Number of iterations required
for i in xrange(0, its): # i is the low index pointer
temp = lst[hiindex] # Perform a classic swap
lst[hiindex] = lst[i]
lst[i] = temp
hiindex -= 1 # Decrement the high index pointer
print "Done!"
# Now test it!!
array = [2, 5, 8, 9, 12, 19, 25, 27, 32, 60, 65, 1, 7, 24, 124, 654]
print array # Print the original sequence
reverse_in_place(array) # Call the function passing the list
print array # Print reversed list
**The result:**
[2, 5, 8, 9, 12, 19, 25, 27, 32, 60, 65, 1, 7, 24, 124, 654]
Done!
[654, 124, 24, 7, 1, 65, 60, 32, 27, 25, 19, 12, 9, 8, 5, 2]
文字列とタプルは不変である、すなわち要素を変更するためにそれらに書き込むことができないので、これはタプルまたは文字列シーケンスでは機能しないことに注意してください。
私は(他の提案とは反対に)l.reverse()
がPython 3と2の長いリストを逆にする最も早い方法であることを発見しました。
l[::-1]
は、リストを元に戻す前にコピーするため、おそらく遅くなります。 list()
によって作られたイテレータの周りにreversed(l)
呼び出しを追加することはいくらかのオーバーヘッドを追加しなければなりません。もちろん、リストのコピーまたはイテレータが必要な場合はそれらの各メソッドを使用しますが、単にリストを逆にしたい場合はl.reverse()
が最速の方法です。
関数
def rev_list1(l):
return l[::-1]
def rev_list2(l):
return list(reversed(l))
def rev_list3(l):
l.reverse()
return l
リスト
l = list(range(1000000))
Python 3.5のタイミング
timeit(lambda: rev_list1(l), number=1000)
# 6.48
timeit(lambda: rev_list2(l), number=1000)
# 7.13
timeit(lambda: rev_list3(l), number=1000)
# 0.44
Python 2.7のタイミング
timeit(lambda: rev_list1(l), number=1000)
# 6.76
timeit(lambda: rev_list2(l), number=1000)
# 9.18
timeit(lambda: rev_list3(l), number=1000)
# 0.46
for x in array[::-1]:
do stuff
可能な方法
list1 = [3,4,3,545,6,4,34,243]
list1.reverse()
list1[::-1]
array=[0,10,20,40]
for e in reversed(array):
print e
逆(配列)を使用するのが最善の方法です。
>>> array = [1,2,3,4]
>>> for item in reversed(array):
>>> print item
組み込みのreversed
を使わずにこれを実装する方法を理解する必要がありますか。
def reverse(a):
midpoint = len(a)/2
for item in a[:midpoint]:
otherside = (len(a) - a.index(item)) - 1
temp = a[otherside]
a[otherside] = a[a.index(item)]
a[a.index(item)] = temp
return a
これにはO(N)時間がかかります。
逆リストの要素を他の変数に格納したい場合は、revArray = array[::-1]
またはrevArray = list(reversed(array))
を使用できます。
しかし、最初の変種は少し速いです。
z = range(1000000)
startTimeTic = time.time()
y = z[::-1]
print("Time: %s s" % (time.time() - startTimeTic))
f = range(1000000)
startTimeTic = time.time()
g = list(reversed(f))
print("Time: %s s" % (time.time() - startTimeTic))
出力:
Time: 0.00489711761475 s
Time: 0.00609302520752 s
リスト内包表記を使う:
[array[n] for n in range(len(array)-1, -1, -1)]
Pythonでは、リストの順序も sort で操作でき、変数を数字/アルファベット順に整理できます。
print(sorted(my_list))
my_list.sort(), print(my_list)
"reverse = True" :というフラグでソートできます。
print(sorted(my_list, reverse=True))
または
my_list.sort(reverse=True), print(my_list)
たぶんあなたは値を並べ替えるのではなく、単に値を逆にしたくないでしょう。それから私達はこれのようにそれをすることができます:
print(list(reversed(my_list)))
** 数字はリスト順でアルファベットよりも優先されます。 Pythonの価値観の構成は素晴らしいです。
あなたはreversed()
を使うことができます
array=[0,10,20,40]
for e in reversed(array):
print e
def reverse(text):
output = []
for i in range(len(text)-1, -1, -1):
output.append(text[i])
return output
厳密に言えば、問題は、リストを逆方向に返す方法ではなく、例リスト名array
のリストを逆方向に戻す方法です。
"array"
という名前のリストを逆にするには、array.reverse()
を使います。
説明されているような信じられないほど便利なsliceメソッドは、array = array[::-1]
を使ってそれ自身のスライスされた変更としてリストを定義することによってリストをその場で逆にするためにも使用できます。
配列インデックスの ビットごとの補数 を使用して、配列を逆にたどることもできます。
>>> array = [0, 10, 20, 40]
>>> [array[~i] for i, _ in enumerate(array)]
[40, 20, 10, 0]
何をしても、このようにしないでください。
要件からPythonへの最も直接的な翻訳は、次のfor
ステートメントです。
for i in xrange(len(array) - 1, -1, -1):
print i, array[i]
これはかなり不可解ですが、役に立つかもしれません。
def reverse(text):
lst=[]
for i in range(0,len(text)):
lst.append(text[(len(text)-1)-i])
return ''.join(lst)
print reverse('reversed')
いくつかの古い学校のロジックを使用して、面接の練習をします。
数字を前後に入れ替えます。 2つのポインターの使用
index[0] and index[last]
def reverse(array):
n = array
first = 0
last = len(array) - 1
while first < last:
holder = n[first]
n[first] = n[last]
n[last] = holder
first += 1
last -= 1
return n
input -> [-1 ,1, 2, 3, 4, 5, 6]
output -> [6, 1, 2, 3, 4, 5, -1]
以下のように リバース 関数を使って印刷してください。
>>> for element in reversed(your_array):
... print element
リストの最後からスタックの一番上にある要素をポップするだけで、リストを常にスタックのように扱うことができます。そうすれば、スタックの先入れ先出しの特性を利用できます。もちろん、あなたは1番目の配列を消費しています。片方のリストがフロントエンドから作成されている間にもう一方のリストがバックエンドから使用されているのがわかるという点で、私はこの方法がとても直感的です。
>>> l = [1,2,3,4,5,6]; nl=[]
>>> while l:
nl.append(l.pop())
>>> print nl
[6, 5, 4, 3, 2, 1]
list_data = [1,2,3,4,5]
l = len(list_data)
i=l+1
rev_data = []
while l>0:
j=i-l
l-=1
rev_data.append(list_data[-j])
print "After Rev:- %s" %rev_data
>>> l = [1, 2, 3, 4, 5]
>>> print(reduce(lambda acc, x: [x] + acc, l, []))
[5, 4, 3, 2, 1]
def reverse(my_list):
L = len(my_list)
for i in range(L/2):
my_list[i], my_list[L-i - 1] = my_list[L-i-1], my_list[i]
return my_list
つかいます
print(reversed(list_name))
インタビュー設定であると仮定した場合、最小限の組み込み関数で
array = [1, 2, 3, 4, 5, 6,7, 8]
inverse = [] #create container for inverse array
length = len(array) #to iterate later, returns 8
counter = length - 1 #because the 8th element is on position 7 (as python starts from 0)
for i in range(length):
inverse.append(array[counter])
counter -= 1
print(inverse)
反対のインデックスの参照を切り替えることによってインプレースを反転する:
>>> l = [1,2,3,4,5,6,7]
>>> for i in range(len(l)//2):
... l[i], l[-1-i] = l[-1-i], l[i]
...
>>> l
[7, 6, 5, 4, 3, 2, 1]
ジェネレータを返す__reverse__
を使って行うことができます。
>>> l = [1,2,3,4,5]
>>> for i in l.__reversed__():
... print i
...
5
4
3
2
1
>>>
>>> L = [1, 2, 3, 4]
>>> L = [L[-i] for i in range(1, len(L) + 1)]
>>> L
[4, 3, 2, 1]