2017-07-11 2 views
0

Ich übe einige Sachen mit der Codewars-Website. Ich denke nicht, dass es für meine Frage relevant ist, aber - Das Ziel des Codes ist, Zahlen wie folgt zu finden: 89 = 8^1 + 9^2 135 = 1^1 + 3^2 + 5^3Warum funktioniert diese Methode zum Zurückgeben des Index nicht immer?

Dieser Code funktioniert mit fast allen Testfällen, aber nicht ein Test, bei dem b> 2000:

def sum_dig_pow(a, b): 
    list = [] 
    for i in range (a, b + 1): 
     digitlist = [int(x) for x in str(i)] 
     sum = 0 
     for x in digitlist: 
      sum += x**(int(digitlist.index(x)) + 1) 
     if sum == i: 
      list.append(i) 
    print list 

Während dieser Code für alle Tests gearbeitet:

def sum_dig_pow(a, b): 
    list = [] 
    for i in range (a, b + 1): 
     digitlist = [int(x) for x in str(i)] 
     sum = 0 
     digicounter = 1 
     for x in digitlist: 
      sum += x**digicounter 
      digicounter += 1 
     if sum == i: 
      list.append(i) 
    print list 

der einzige Unterschied besteht darin, dass Ich habe den a-Zähler verwendet, um den Index von x zurückzugeben, anstatt ihn mit Index (x) zu erhalten.

Kann jemand erklären, warum der erste Code nicht immer funktioniert? Im Allgemeinen scheint es mir schwer zu sein, wenn ich auf den Index eines Artikels in einer Liste wie diesem verweisen muss ... und am Ende nur einen Counter wie ich verwende. :/

(auch, ich weiß, dass es mehr pythonic und effiziente Wege der Durchführung dieser Aufgabe sind, ich bin doch nur nicht sehr gut.)

+1

'digcounter' behält einen genauen Index. 'list.index()' findet nur den Index der ** ersten ** Instanz. Wenn Sie also Ziffern haben, die mehr als einmal vorkommen, erhalten Sie den 'falschen' Index für das 2. oder höhere Vorkommen dieser Ziffer. Noch bessere Idee: benutze 'enumerate()', um dir den Index zu geben. –

+0

Sieht so aus, als müsste ich herausfinden, was Enumerate tut. Vielen Dank! –

Antwort

0

Ihre erste Funktion Zahlen nicht wie 1676 oder 2427 finden werden, weil sie enthalten wiederholte Ziffern und .index() gibt nur das erste Auftreten eines Listenelements zurück.

Außerdem nicht list als Variablennamen verwenden, schattiert den eingebauten Namen.

Verwandte Themen