2016-09-07 2 views
0

Ich habe vor kurzem ein Problem gelöst wie unten in Codewars (NOT gefragt, eine Lösung, bereits gelöst) und obwohl es nicht die optimierte Lösung Ich stieß auf ein sehr interessantes Problem, das ich nicht konnte finde eine Antwort auf.Summe der Paare: Codewars

Ich habe nicht die Absicht, die Lösung zu geben, aber nur verstehen, was das in dieser Anomalie führte geschah

Das Problem, wie lief - eine Liste von ganzen Zahlen und einen einzelnen Summenwert gegeben, kehren die ersten beiden Werte (Parse von links bitte) in der Reihenfolge der Erscheinung, die sich addieren, um die Summe zu bilden.

recht einfaches Problem und eine einfache, wenn nicht die optimale Lösung, die ich mit aufkam -

def sum_pairs(ints, s): 
    indices = [] 
    for i in ints: 
     if (s-i) in ints[ints.index(i)+1:]: 
      print(ints.index(i)) 
      print(ints[ints.index(i)+1:]) 
      print(i,s-i) 
      indices.append([ints.index(i),ints[ints.index(i)+1:].index(s-i)+len(ints[:ints.index(i)])+1]) 
    if(len(indices) == 0): 
     return None 
    print(indices) 
    indices.sort(key=lambda x: x[1]) 
    print(indices) 
    return [ints[indices[0][0]], ints[indices[0][1]]] 

ich bestanden alle Testfälle.

Ich habe die print-Anweisungen zum Debuggen verwendet und herausgefunden, was vor sich ging. Beispiel-Testfälle und ihre Ausgabe, die mich ratlos waren, sind unten angegeben.

sum_pairs([1, 2, 3, 4, 1, 0], 2) 

0 
[2, 3, 4, 1, 0] 
(1, 1) 
1 
[3, 4, 1, 0] 
(2, 0) 
0 
[2, 3, 4, 1, 0] 
(1, 1) 
[[0, 4], [1, 5], [0, 4]] 
[[0, 4], [0, 4], [1, 5]] 

sum_pairs([10, 5, 2, 3, 7, 5]) 
1 
[2, 3, 7, 5] 
(5, 5) 
3 
[7, 5] 
(3, 7) 
1 
[2, 3, 7, 5] 
(5, 5) 
[[1, 5], [3, 4], [1, 5]] 
[[3, 4], [1, 5], [1, 5]] 

So nun zu dem Teil, den ich nicht herausfinden konnte, kann die Ausgabe einer Beobachtung, dass Fall in Test siehe 1 wird 0 gedruckt zweimal und die Ints [ints.index (i) +1:] sind [2, 3, 4, 1, 0] für beide 1 an Position 0 und 4 und der Eintrag [0,4] wird zweimal angehängt. Ein ähnliches Muster ist in Testfall 2. Des beobachtet, wenn die Bedingung, die besagt,

if (s-i) in ints[ints.index(i)+1:] 

soll nicht auf true zweites Mal als Ints ausgewertet werden [ints.index (i) +1:] ist es, um sicherzustellen, dass die neue Liste vom Element neben dem Vorkommen von i beginnt.

Es scheint nicht so wichtig, wie ich die Lösung bekam, aber es wäre toll, wenn jemand herausfinden könnte, was tatsächlich passiert ist.

HINWEIS: Ich habe 2 schlechte Erfahrungen gemacht, wo Leute meine Frage abgelehnt haben, ohne einen Grund dafür in einem vordefinierten Verhältnis zu geben. Es wäre wirklich nützlich, wenn ich Feedback für einen solchen Downvote geben könnte, würde mich auch freuen, wenn jemand diese Fragen überprüfen und Feedback geben könnte, wenn Verbesserungen vorgenommen werden können.

+1

Erwarten Sie, dass "ints.index (i)" der Index des bestimmten Vorkommens von "i" ist, mit dem Sie arbeiten? Sie wollen 'enumerate' dafür. 'index' macht etwas ganz anderes. – user2357112

+0

Dies ist nicht die endgültige Lösung und ich muss für Timeout optimieren und diese Informationen sind unabhängig von dem Problem, das ich gestellt habe. –

+0

Hallo @ user2357112 danke für die schnelle Antwort, ich war mir dieser Informationen nicht bewusst. Mein Verständnis war, dass Index (i) den Index des aktuellen Artikels zurückgeben würde. Ich verstehe jetzt, was vor sich geht. Ich weiß nicht, wie ich die Frage beenden soll und kann Ihre Antwort nicht bewerten, da ich nicht genügend Reputation habe. Trotzdem danke! –

Antwort

1

ints.index(i) gibt Ihnen nicht den Index des bestimmten Auftretens von i Sie arbeiten mit. Wenn Sie das wollen, wollen Sie enumerate, nicht index.

ints.index(i) bedeutet "durch ints gehen und den Index des ersten Element ints die i gleich finden". i enthält keine Informationen darüber, woher in ints es kam, so gibt es keine Möglichkeit für index zu sagen, dass Sie an ein bestimmtes Vorkommen von i gedacht haben. enumerate vermeidet dieses Problem, indem es seinen eigenen Zähler behält und jedes Mal, wenn es ein Element erzeugt, inkrementiert, so dass es immer weiß, um welchen Index es sich handelt.