2016-05-31 4 views
-4

Ich importierte eine .xml mit zwei Spalten (Name, Menge). Ich möchte eine Funktion schreiben, die die Namen in Gruppen gruppiert, deren Menge gleich 50 ist. Zum Beispiel gegeben: x - 10, y - 35, z - 42, n - 5, m - 3 und p - 5. Das Programm würde zurückkehren "x, y, n" und "z, m, p". Es würde nicht "x, y, p" zurückgeben, da n zuerst auftritt. Darüber hinaus verwendete es nach der ersten Iteration der Schleife nicht z, m oder p, sondern berücksichtigte sie in der zweiten Iteration, während die Namen ignoriert wurden, die bereits von der ersten Iteration verwendet wurden.Ist es möglich, über eine Liste zu iterieren und bestimmte Elemente zu überspringen?

Für solch ein kleines Beispiel, bin ich in der Lage, diesen Code mit meinem begrenzten Wissen zu erstellen. Allerdings muss ich dies auf über 1000 Namen anwenden und dafür ist mein Code, der hauptsächlich aus while- und if/else-Schleifen besteht, zu ineffizient.

Nur ein wenig mehr Informationen: Der Code im Wesentlichen in drei Teile unterteilt ist: (A) Ist die Summe 50 erreicht -> Ausgang (B), wenn weniger als 50, weiter, bis (A) (C) Wenn größer als 50, ignoriere die Nummer des gerade hinzugefügten Programms und versuche die nächste in der Liste und prüfe auf Bedingung (B), bis (A) erreicht ist.

Ich kann meistens (A) und (B) herausfinden, aber kämpfe mit effizienter Ausführung von Teil (C).

Vielen Dank im Voraus für die Hilfe!

+4

Es ist viel einfacher zu helfen, wenn Sie den Code zeigen, den Sie bisher entwickelt haben, als ein vollständiges Arbeitsbeispiel. – Conor

Antwort

0

Da Ihr Ziel darin besteht, Tupel zu finden, die exakt 50 ergeben, ist die Lösung ein wenig komplizierter als Ihr aktueller Ansatz. Betrachten Sie diese Zahlen:

x 20 
y 25 
z 10 
m 15 
n 8 
p 22 

Ihr Algorithmus würde hinzufügen ersten x = 20 und y = 25 und dann durch den Rest der Liste gehen, ohne ein passendes 5 zu finden, die dieses Tupel vervollständigen würden. Die richtige Lösung wäre "x, n, p" und "y, z, m".

Ein funktionierender Algorithmus würde Ketten von Einträgen sammeln, die auf weniger als 50 summieren, und eine Iteration durch die Liste stoppen, wenn eine Kette 50 erreicht. Die Kettenelemente würden dann aus der Liste entfernt und der Prozess wiederholt, bis keine Tupel mehr vorhanden sind kann gefunden werden.

Python-Code, wie versprochen: (den Stil verzeihen, das ist mein erstes Python-Programm :-))

class ListElement: 
    def __init__(self, name, value): 
     self.name = name 
     self.value = value 

    def __repr__(self): 
     return self.name + "=" + self.value.__str__() 

class ChainElement: 
    def __init__(self, prev, listElement): 
     self.prev = prev 
     self.listElement = listElement 
     if prev: 
      self.value = listElement.value + prev.value 
     else: 
      self.value = listElement.value 

    def __repr__(self): 
     if self.prev: 
      return self.prev.__repr__() + "," + self.listElement.__repr__() 
     else: 
      return self.listElement.__repr__() 

    def removeAllFrom(self, list): 
     list.remove(self.listElement) 
     if self.prev: 
      self.prev.removeAllFrom(list) 

list = [] 
list.append(ListElement("x", 20)) 
list.append(ListElement("y", 25)) 
list.append(ListElement("z", 10)) 
list.append(ListElement("m", 15)) 
list.append(ListElement("n", 8)) 
list.append(ListElement("p", 22)) 

def find_chain(): 
    chains = [ChainElement(None, list[0])] 

    for le in list[1:]: 
     new_chains = [] 
     for ce in chains: 
      new_chain = ChainElement(ce, le) 
      if new_chain.value == 50: 
       return new_chain 
      elif new_chain.value < 50: 
       new_chains.append(new_chain) 
     chains.extend(new_chains); 
    return None 

while list: 
    tuple = find_chain() 
    if tuple: 
     print "Found:", tuple 
     tuple.removeAllFrom(list) 
    else: 
     print 
     print "Residue:", list 
     break 

Es gibt Kombinationen von Werten, für die dieses Programm keine vollständige Lösung selbst finden, obwohl ein solches vorhanden ist Verständnis und Behebung dieses Problems bleibt dem Leser als Übung überlassen ...

+0

Oh ich sehe, da ich harten Code benutzt hatte, um zu sehen, ob es funktionieren würde, hatte ich nicht darüber nachgedacht. Haben Sie Vorschläge, um mir zu helfen, mit der von Ihnen vorgeschlagenen Lösung zu beginnen? Ich bin ein Neuling bei Python und fühle mich über meinen Kopf hinweg. Ich danke dir sehr. – RPB

+0

Ich bin selbst Anfänger bei Python, also müsste ich auch an diesem Beispiel arbeiten. Ich könnte den Algorithmus in Pseudocode (oder Smalltalk) aufschreiben, aber Sie müssten arbeiten Python-Code von diesem schreiben ... –

+0

Sicher! Pseudocode wäre großartig, ich denke, ich könnte es von dort aus schaffen. Vielen Dank im Voraus! – RPB