2012-03-07 21 views
5

निम्नलिखित अधिक मतलब होगा अगर तुम कभी Minecraft निभाई है। चूंकि आप में से कई नहीं हैं, इसलिए मैं इसेअजगर रिकर्सिव डाटा पढ़ना

पर एक व्याख्यान समारोह लिखने की कोशिश कर रहा हूं जो कि Minecraft व्यंजनों के एक फ्लैटफाइल से किसी भी Minecraft आइटम को तैयार करने के लिए कदम ढूंढ सकता है। यह मुझे वास्तव में स्टंप किया है।

FlatFile थोड़े लंबे इसलिए मैंने इसे this सार में शामिल है।

def getRecipeChain(item, quantity=1): 
    #magic recursive stuffs go here 

तो बुनियादी तौर पर मैं तो पहले नुस्खा देखो इतने पर जब तक आप कोई व्यंजनों के साथ आइटम के लिए मिलता है कि पहली नुस्खा के सभी घटकों के लिए व्यंजनों को देखने और करने की जरूरत है। हर बार जब मैं एक सूची नुस्खा संलग्न करने के लिए की जरूरत है तो मैं तो यहाँ शिल्प आइटम के लिए किस क्रम में की अनुदेश सेट का एक प्रकार मिलता है।

समारोह मैं अब है (एक का काम नहीं करता है)

def getRecipeChain(name, quantity=1): 
    chain = [] 

    def getRecipe(name1, quantity1=1): 
     if name1 in recipes: 
      for item in recipes[name1]["ingredients"]["input"]: 
       if item in recipes: 
        getRecipe(item, quantity1) 
       else: 
        chain.append(item) 

    getRecipe(name, quantity) 
    return chain 

यहाँ आदर्श उत्पादन मैं के लिए जा रहा हूँ है। यह एक शब्दकोश है जिसमें वस्तु का नाम और मात्रा संग्रहित है।

>>> getRecipeChain("solar_panel", 1): 
{"insulated_copper_cable":13, "electronic_circuit":2, "re_battery":1, "furnace":1, "machine":1, "generator":1, "solar_panel":1} 

तो सवाल यह है कि, मैं इसे कैसे कर सकता हूं?

मैं लोगों के लिए पूछ काम करने के लिए आपके द्वारा यहां सिकोड़ी है के लिए पता है, इसलिए यदि आप समझते हैं कि यह एक छोटे से बहुत करीब है करने के लिए आप सिर्फ मेरे लिए कोडिंग कर रही है, तो बस का कहना है।

+2

बस कहने लगे, लेकिन मुझे लगता है अपने नमूना उत्पादन सही नहीं है ... – PearsonArtPhoto

+0

किस तरह से यह सही नहीं है? – giodamelio

+2

ठीक है, insulated_copper_cable आधार वस्तु नहीं है, है ना? न ही इलेक्ट्रॉनिक_circuit है। ऐसा लगता है कि आप आधार सामग्री प्राप्त करना चाहते हैं, जटिल नहीं। – PearsonArtPhoto

उत्तर

3

इस सुंदर ढंग से collections.Counter का उपयोग कर हल किया जा सकता है, जो इसके अलावा समर्थन करता है:

from collections import Counter 

def getRecipe(name, quantity=1): 
    if not name in recipes: return Counter({name: quantity}) 

    subitems = recipes[name]["ingredients"]["input"] 
    return sum((getRecipe(item, quantity) for item in subitems), 
      Counter()) 

print repr(dict(getRecipe("solar_panel"))) 
# => {'copper': 39, 'refined_iron': 10, 'glass': 3, 
#  'rubber': 78, 'cobblestone': 8, 'tin': 4, 
#  'coal_dust': 3, 'nothing': 10, 'redstone': 6} 
1

मुझे लगता है कि समस्या 2 गुना है। सबसे पहले, आपको पकाने की विधि() में रिकर्सिव कॉल में श्रृंखला में आइटम जोड़ने की आवश्यकता है। दूसरा, मुझे लगता है कि दो कार्य अनावश्यक रूप से जटिल चीजें हैं। मुझे लगता है कि केवल आंतरिक को करना चाहिए। ऐसा कुछ है जिसे आप ढूंढ रहे हैं। मैंने इसका परीक्षण नहीं किया है, लेकिन आपको सही रास्ते पर शुरू करने के लिए पर्याप्त होना चाहिए।

def getRecipe(name, quantity=1): 
    chain=[]; 
    if name in recipes: 
     for item in recipes[name]["ingredients"]["input"]: 
      if item in recipes: 
       chain.append(getRecipe(item, quantity)) 
      else: 
       chain.append(item) 
    return chain 

संपादित करें: टिप्पणियां पाइथन ज्ञान की कमी को भर रही हैं, इसलिए यहां एक बेहतर समाधान है।

from collections import Counter 
def getRecipe(name, quantity=1, count=Counter()): 
    if name in recipes: 
     for item in recipes[name]["ingredients"]["input"]: 
      if item in recipes: 
       getRecipe(item, quantity,counter) 
      else: 
       counter[item]+=quantity 
    return counter 
+0

उसका वांछित आउटपुट एक नियम है, इसलिए chain.append की बजाय, आपको * chain.setdefault (आइटम, 0) + = मात्रा * –

+0

@campos करना चाहिए: यह अपेक्षित काम नहीं करेगा, मान में वृद्धि नहीं की जाएगी। एक 'डिफॉल्टडिक्ट (int) 'यहां आदर्श डेटा संरचना होगी। –

+0

ओह, यह सच है। –

संबंधित मुद्दे