2016-05-31 7 views
-4

2つの列(名前、数量)を持つ.xmlをインポートしました。私は数量が50に等しいグループに名前をグループ化する関数を書いたがっています。例えばx - 10、y - 35、z - 42、n - 5、m - 3、p - 「x、y、n」および「z、m、p」を含む。最初にnが発生するので、 "x、y、p"は返されません。さらに、ループの最初の反復の後では、z、mまたはpは使用しませんでしたが、最初の反復ですでに使用されている名前は無視して2回目の反復でそれらを考慮します。リストを反復して特定の要素をスキップすることはできますか?

このような小さな例では、限られた知識でこのコードを作成することができます。しかし、私はこれを1000以上の名前に適用する必要があります。このために、ほとんどのwhileループとif/elseループで構成されるコードはあまりにも非効率的です。

ただ詳細: コードは基本的に3つの部分に分割される:合計が50に達した場合 (A) - 50未満の場合>出力 (B)は、(A) (Cまで続けます)が50より大きい場合は、プログラムが追加したばかりの番号を無視し、リスト内の次の数字を試し、(A)に達するまで条件(B)をテストします。

私は(A)と(B)をよく理解できますが、効率的に実行する部分(C)には苦労しています。

ありがとうございました!

+4

これまでに開発したコードを表示すると、少なくとも完全な動作例として役立ちます。 – Conor

答えて

0

あなたの目標は最大50個のタプルを正確に見つけることです。ソリューションは現在のアプローチよりも少し複雑になります。 これらの数字を考えてみましょう:

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

あなたのアルゴリズムでは、最初のx = 20、Y = 25を追加し、このタプルを完了しまうマッチング5を見つけることなく、リストの残りの部分を歩くでしょう。正しい解決策は "x、n、p"と "y、z、m"です。

作業アルゴリズムは、合計が50未満になるエントリのチェーンを収集し、1つのチェーンが50に達したときにリストを通じて1つの反復を停止します。チェーン要素がリストから削除され、見つけることができます。

Pythonコード約束通り:(これは私の最初のpythonプログラム:-)で、スタイルをご容赦)

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 

このプログラムは1が存在するにもかかわらず、完全なソリューションを見つけることができませんそのための値の組み合わせがあります。これを理解して修正することは、読者の練習として残されています...

+0

ああ、私はそれが動作するかどうかを確認するためにハードコードを使用していたので、私はそれを考慮していなかった。あなたが提案したソリューションを開始するのに役立つ提案がありますか?私はPythonの初心者であり、私の頭の上の方法を感じる。どうもありがとうございます。 – RPB

+0

私は自分でpython初心者ですので、この例でもかなり作業しなければなりません。私は擬似コード(またはスモールトーク)でアルゴリズムを書くことができましたが、そこから作業用のPythonコードを書く必要があります。 –

+0

確かに!擬似コードは素晴らしいだろう、私はそこから管理できると思う。前もって感謝します! – RPB