web-dev-qa-db-ja.com

Pythonのリストを逆にするにはどうすればいいですか?

Pythonで次のことができますか?

array = [0, 10, 20, 40]
for (i = array.length() - 1; i >= 0; i--)

配列の要素が必要ですが、最後から最初までです。

873
Leo.peis

これには reversed 関数を使用できます。

>>> array=[0,10,20,40]
>>> for i in reversed(array):
...     print(i)

reversed(...)はリストを返さないことに注意してください。あなたはlist(reversed(array))を使って逆のリストを得ることができます。

1129
codaddict
>>> L = [0,10,20,40]
>>> L[::-1]
[40, 20, 10, 0]

拡張スライスの構文はPythonでよく説明されています リリースの新しいエントリ2.3.5

コメントの中の特別な要望により これが最新のスライスドキュメントです

1143
bernie
>>> L = [0,10,20,40]
>>> L.reverse()
>>> L
[40, 20, 10, 0]

または

>>> L[::-1]
[40, 20, 10, 0]
333
ghostdog74

これはリストを複製することです。

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)
48
fahad

私はPythonでリストを逆にする最善の方法はそうすることだと思います:

a = [1,2,3,4]
a = a[::-1]
print(a)
>>> [4,3,2,1]

仕事は完了です、そして今、あなたは逆のリストを持っています。

42
prossellob

同じリストを元に戻すには:

array.reverse()

逆のリストを他のリストに割り当てるには、次のようにします。

newArray = array[::-1] 
26
Pawan Kumar

スライシングを使う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]

文字列とタプルは不変である、すなわち要素を変更するためにそれらに書き込むことができないので、これはタプルまたは文字列シーケンスでは機能しないことに注意してください。

22
SimonM

私は(他の提案とは反対に)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
17
Chris_Rands
for x in array[::-1]:
    do stuff
17
Swiss

reversed および list の場合:

>>> list1 = [1,2,3]
>>> reversed_list = list(reversed(list1))
>>> reversed_list
>>> [3, 2, 1]
14
Eyal Levin

可能な方法

list1 = [3,4,3,545,6,4,34,243]

list1.reverse()

list1[::-1]
11
Sanjay Pradeep
array=[0,10,20,40]
for e in reversed(array):
  print e
10

逆(配列)を使用するのが最善の方法です。

>>> 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)時間がかかります。

7
gpj

逆リストの要素を他の変数に格納したい場合は、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
5
Temak

リスト内包表記を使う:

[array[n] for n in range(len(array)-1, -1, -1)]
4
koo

組織的価値

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の価値観の構成は素晴らしいです。

4
Marcelo Lunardi

あなたはreversed()を使うことができます

array=[0,10,20,40]

for e in reversed(array):
  print e
3
Davis
def reverse(text):
    output = []
    for i in range(len(text)-1, -1, -1):
        output.append(text[i])
    return output
3
Shawn Tsai

厳密に言えば、問題は、リストを逆方向に返す方法ではなく、例リスト名arrayのリストを逆方向に戻す方法です。

"array"という名前のリストを逆にするには、array.reverse()を使います。

説明されているような信じられないほど便利なsliceメソッドは、array = array[::-1]を使ってそれ自身のスライスされた変更としてリストを定義することによってリストをその場で逆にするためにも使用できます。

3
mogga

配列インデックスの ビットごとの補数 を使用して、配列を逆にたどることもできます。

>>> array = [0, 10, 20, 40]
>>> [array[~i] for i, _ in enumerate(array)]
[40, 20, 10, 0]

何をしても、このようにしないでください。

3
101

要件からPythonへの最も直接的な翻訳は、次のforステートメントです。

for i in xrange(len(array) - 1, -1, -1):
   print i, array[i]

これはかなり不可解ですが、役に立つかもしれません。

2
John Machin
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
dks

いくつかのロジックを使用する

いくつかの古い学校のロジックを使用して、面接の練習をします。

数字を前後に入れ替えます。 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]
2
Israel Manzo

以下のように リバース 関数を使って印刷してください。

>>> for element in reversed(your_array):
...     print element
2
Nabin

リストの最後からスタックの一番上にある要素をポップするだけで、リストを常にスタックのように扱うことができます。そうすれば、スタックの先入れ先出しの特性を利用できます。もちろん、あなたは1番目の配列を消費しています。片方のリストがフロントエンドから作成されている間にもう一方のリストがバックエンドから使用されているのがわかるという点で、私はこの方法がとても直感的です。

>>> l = [1,2,3,4,5,6]; nl=[]
>>> while l:
        nl.append(l.pop())  
>>> print nl
[6, 5, 4, 3, 2, 1]
2
Rick
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 
2
Rohan Chavan
>>> l = [1, 2, 3, 4, 5]
>>> print(reduce(lambda acc, x: [x] + acc, l, []))
[5, 4, 3, 2, 1]
1
grf
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
1
Jeff Mandell

つかいます

print(reversed(list_name))
1
hmn Falahi

インタビュー設定であると仮定した場合、最小限の組み込み関数で

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)
1
Fed

反対のインデックスの参照を切り替えることによってインプレースを反転する:

>>> 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]
0
user4776653

ジェネレータを返す__reverse__を使って行うことができます。

>>> l = [1,2,3,4,5]
>>> for i in l.__reversed__():
...   print i
... 
5
4
3
2
1
>>>
0
SuperNova
>>> L = [1, 2, 3, 4]
>>> L = [L[-i] for i in range(1, len(L) + 1)]
>>> L
[4, 3, 2, 1]
0
k15