2016-08-30 15 views
1

リストの上位2つの値を探すという質問に答えて現在のコードを見つけましたが、コードの部分を理解するのに問題があり、見つからない他の場所で助けてください。私は、誰かが個々の部品が何を意味するのか教えてもらえるかどうか疑問に思いましたか私はコードの一部を理解するのに助けが必要です -

numbers = [20,67,3,2.6,7,74,2.8,90.8,52.8,4,3,2,5,7] 
if numbers[0]>numbers[1]: 
    m, m2 = numbers[0], numbers[1] 
else: 
    m, m2 = numbers[1], numbers[0] 
for x in numbers[1:]: 
    if x>m2: 
     if x>m: 
      m2, m = m, x # I am especially unsure of what is going on here 
     else: 
      m2 = x 

平方メートルここでリターン74

+0

わからない、それによって、私はコメントします。 'm2、m = m、x'は' m2 = m'と 'm = x'に相当します。 2番目に大きな数字である 'm2'の中で、コードは' m'でリストの最大数を返さなければなりません。最初の 'if-else'のために、少なくとも2つの要素が存在すると想定されます。 –

+0

呼び出された並列割当て。 (m2、m)=(m、x)のように考える。 – YOU

+0

これは簡潔ですが(おそらくかなり)、 'm2、m = m、x'のような並列代入(および変数の再宣言)は混乱の原因になります。 ['可読性カウント](https://www.python.org/dev/peps/pep-0020/)。 –

答えて

2

は、それが何をしているかのラフな擬似コードです:

  1. メートルのリストとm2で最大の変数を追跡します第二のトラックを保持します最大。
  2. 最初にmとm2はリストの最初の2つの要素になり、mは最初の2つのうち大きい方になりますが、m2は最初の2つのうち小さい方になります
  3. 次に、インデックス1各要素xについて、最初にそれが現在のm2より大きいかどうかをチェックします。そうであれば、それはもはや2番目に大きい要素ではないため、m2を更新する必要があります。また、xがmより大きいかどうかを調べる必要があります。もしxmがxとm2になるようにmを更新すると、以前のmとなります。

私はコメントしました以下のコードで解説しています:

numbers = [20,67,3,2.6,7,74,2.8,90.8,52.8,4,3,2,5,7] # list 
# This part sets m1 and m2 to be the bigger of the first two elements in the list. 
# The notation m,m2 = numbers[0], numbers[1] is equivalent to m = numbers[0] followed by m2 = numbers[1] 
if numbers[0]>numbers[1]:  
    m, m2 = numbers[0], numbers[1] 
else: 
    m, m2 = numbers[1], numbers[0] 
for x in numbers[1:]:   # iterate over list start at index 1 
    if x>m2:     # if current element is greater than m2, we need to update m2 
     if x>m:    # if current element is also greater than m, we need to set m2 to the value of m, and then update m to the new largest value which is x. 
      m2, m = m, x  # This is doing m2 = m followed by m = x 
     else: 
      m2 = x   # if current element is greater than m2 but not m, just update m2 to x 

上記のコードは素晴らしいので、Pythonを使い始めるとよいです。あなたのためにこれを行いますより1つのライナーもあります:

m, m2 = sorted(numbers, reverse=True)[:2] 

は説明:この質問は上のトピックである場合

sorted(numbers, reverse=True)     # => returns sorted version of numbers [90.8, 74, 67, 52.8, 20, 7, 7, 5, 4, 3, 3, 2.8, 2.6, 2] 
sorted(numbers, reverse=True)[:2]    # => splices the list to the first two elmems i.e [90.8, 74] 
m, m2 = sorted(numbers, reverse=True)[:2]  # => Does the confusing multiple assignment as m = first element of the list and m2 = second element of the list 
+1

ご理解いただきありがとうございます。私はm2の使用を開始したばかりの開始点を徹底的に理解していました。m = m、xこのようにしてm = mが利用されていないので、コードが何をしているのか分かりませんでした。ありがとう 私はソートを使用して私が前に置いた解決策になっていたと思ったが、私はこの解決策を見て、ちょっと試してみてみよう! – Leanne

関連する問題