2010-11-25 6 views
13

戻りオブジェクトは、list.reverse()の場合、Noneという名前です。私がsolution(k)に電話すると、このコードは失敗します。私が一時的に過ごす方法はありますか?または私はそれをどうすればいいのですか?list.reverseはリストを返しませんか?

fCamel = 'F' 
bCamel = 'B' 
gap = ' ' 

k = ['F', ' ', 'B', 'F'] 

def solution(formation): 
    return ((formation.index(bCamel) > (len(formation) - 1 - (formation.reverse()).index(fCamel)))) 

p.s.これはPythonの私の最初のコードです。私はそれが機能的だと思った。

+0

はどうなりますか?おそらく、あなたが何をしようとしているのかを記述すると、私たちはあなたがより良い "ピジョンソニック"ソリューションを作るのを助けることができます。 – GWW

+0

私はPythonでそのラクダのパズルを解決しようとしているので、私は少し言語を学ぶことができます。基本的に、この関数はすべての 'F'が最初の 'B'の左側にある場合にtrueを返します。 – nakiya

+0

ちょうど不思議です。私はupvotesなしで残るより多くの質問を参照してください。これは面白い質問のように思えます。なぜ人々はもう少し質問に投票しないのですか?私はしばしば、回答が多量の票を得ていることが分かります。質問は少なくとも興味深い解決策や議論をもたらす可能性がありますが、質問自体には1つの投票はありません。私に奇妙に見える(O_O)乾杯! – Morlock

答えて

18

reversed(formation)を使用すると、逆イテレータのformationを返すことができます。 formation.reverse()に電話すると、リストのインプレース・リバースを行い、なしを返します。

編集:私はあなたが今やろうとしているものを見る

が、私の意見ではそれだけでリスト内包でこれを行うには簡単です:

def solution(formation): 
    return len([k for k in formation[formation.index(bCamel)+1:] if k == fCamel]) == 0 

これは、基本的には後にすべての要素を見ます最初にbCamelとし、値がfCamelのすべての要素を収集します。そのリストの長さが== 0の場合は、解決策があります。

は、ここではいくつかの例です:

>>> k = ['F','F','B','B','F'] 
>>> solution(k) 
False 
>>> k = ['F','F','B','B','B'] 
>>> solution(k) 
True 
>>> k = ['F','F','B','F','F','B','B'] 
>>> solution(k) 
False 
>>> 
+3

"反転"はリストを返しませんが、反復子( "index"メソッドを持たない)はOPの未修正コードでは機能しません。 – rbp

+0

ええ、私はそれを思い出して、コメントを調整しました。彼は、彼が望むやり方で動作させるためには、コードを少し修正する必要があります。 – GWW

+0

私はそれを理解しています。しかし、逆のオブジェクトを返すかどうかは、はるかに意味がありました(これは?またはあなたはそれをPythonで何と呼んでいますか?)?それ以外の機能はありますか?そうでなければ私は別の行をいくつか持っています:( – nakiya

4

list.reverseは、インプレース反転します。つまり:

>>> l = [1, 2, 3] 
>>> l.reverse() 
>>> l 
[3, 2, 1] 

Python documentationを参照してください、これらのようなものがレイアウトされています。

ヘルプ(l.reverse)組み込み関数の逆のヘルプ:あなたはまた、[ヘルプ]ビルトインを試すことができます(

リバース...) L.reverse() - 反転インプレイス

5

GWWの答えに基づいて構築するには、このコードをそのまま動作させたい場合はlist(reversed(formation))とすればよいでしょう。あなたが本当に代わりにformation.reverse()を使用できるようにしたい場合は、listをサブクラス化する必要があります:

>>> class ReversableList(list): 
...  def reverse(self): 
...   return list(reversed(self)) 
... 
>>> x = ReversableList([1,2,3]) 
>>> x.reverse() 
[3, 2, 1] 

これは賢明であるかどうかはもちろんの別の質問です。

0

美しいものではありませんが、私は前例の回答に相当するものは見つかりませんでした。速度やメモリのコストが低い場合(リストの長さがあまり長くない、または操作が巨大な回数繰り返されない場合)、これはかなり簡単で読みやすくなります。あなたが逆のリストを返すためにスライスし使用することができます

import copy 

fCamel = 'F' 
bCamel = 'B' 
gap = ' ' 

k = ['F', ' ', 'B', 'F'] 

def solution(formation): 
    rev_formation = copy.copy(formation) 
    rev_formation.reverse() 
    return ((formation.index(bCamel) > (len(formation) - 1 - 
      (rev_formation).index(fCamel)))) 

乾杯

14

l[::-1] 
+0

最後に "l = [...]/print(l)/ print(l [:: - 1]" –

+2

これが本当の答えですあなたはリスト内包表記の中でそれを行うことができるように、逆のリストをインプレースで返します。 –

1

は、私はこの問題に出くわしたとJavaScriptからのpythonに新しいユーザーのためにいくつかのことを明確にしたかったですバックグラウンド。

javascriptでは、a.reverse()が適切な位置に戻り、呼び出されると配列が返されます。

Javascriptを:Pythonで

var a = [2, 3 ,4] 
console.log(a.reverse()) 
// outputs [4, 3, 2] 

a.reverse()は、所定の位置に逆になりますが、配列を返しません。これは私にとって混乱の原因となったものです。 Pythonで

:あなたが探している要素がリストにない場合

a = [2, 3, 4] 
a.reverse() 
print(a) 
# outputs [4, 3, 2] 
# can't do print(a.reverse()) 
関連する問題