2012-03-07 19 views
5

पर संख्याओं की एक सरणी बनाना, मैं अपने कुछ रसायन गृहकार्य के लिए कुछ त्वरित और गंदे स्क्रिप्ट पर काम कर रहा हूं, और उनमें से एक निरंतर लंबाई की सूचियों के माध्यम से पुनरावृत्त करता है जहां सभी तत्व योग होते हैं एक स्थिर निरंतर। प्रत्येक के लिए, मैं जांचता हूं कि क्या वे कुछ अतिरिक्त मानदंडों को पूरा करते हैं और उन्हें किसी अन्य सूची में ले जाते हैं।किसी दिए गए नंबर

मैं योग मानदंडों को पूरा करने के लिए एक तरीका खोज निकाला है, लेकिन यह खराब लग रहा है, और मैं क्या यहां पढ़ाने योग्य पल के कुछ प्रकार है यकीन है:

# iterate through all 11-element lists where the elements sum to 8. 
for a in range(8+1): 
for b in range(8-a+1): 
    for c in range(8-a-b+1): 
    for d in range(8-a-b-c+1): 
    for e in range(8-a-b-c-d+1): 
    for f in range(8-a-b-c-d-e+1): 
     for g in range(8-a-b-c-d-e-f+1): 
     for h in range(8-a-b-c-d-e-f-g+1): 
     for i in range(8-a-b-c-d-e-f-g-h+1): 
     for j in range(8-a-b-c-d-e-f-g-h-i+1): 
      k = 8-(a+b+c+d+e+f+g+h+i+j) 
      x = [a,b,c,d,e,f,g,h,i,j,k] 
      # see if x works for what I want 
+0

'[itertools.product में Vals के लिए Vals (रेंज (8), दोहराने = 11) यदि राशि (Vals) == 8]' अधिक सुंदर है, लेकिन ** ज्यादा ** अपने समाधान की तुलना में धीमी। – eumiro

+0

+1 - आपके दोहराए जाने वाले रसायन शास्त्र गृहकार्य को स्वचालित करने के लिए कंप्यूटर का उपयोग करने के लिए प्रॉप्स। –

+0

मेरी अंतर्दृष्टि यह है: 11 पूर्णांकों की सूची के लिए सभी 8 की तुलना में, संख्याओं में से बहुत सारे शून्य होने जा रहे हैं। ऐसा करने का एक तेज़ तरीका 8 से पूर्णांक को समेकित करने के सभी तरीकों को ढूंढना होगा - उदाहरण के लिए '8, 1 + 7, 2 + 6, 3 + 5, 4 + 4, 1 + 1 + 6, 1 + 2 + 5 ... 'और फिर बस उन शून्यों की उचित संख्या के साथ अनुमति दें। –

उत्तर

1

यहां एक पुनरावर्ती जनरेटर है जो लिक्सिकोग्राफिक आदेश में सूचियां उत्पन्न करता है। exact को True छोड़कर अनुरोधित परिणाम देता है जहां प्रत्येक राशि == सीमा; exact से = योग < = सीमा के साथ सभी सूचियों को सेट करता है। आवर्ती मध्यवर्ती परिणामों का उत्पादन करने के लिए इस विकल्प का लाभ उठाता है।

def lists_with_sum(length, limit, exact=True): 
    if length: 
     for l in lists_with_sum(length-1, limit, False): 
      gap = limit-sum(l) 
      for i in range(gap if exact else 0, gap+1): 
       yield l + [i] 
    else: 
     yield [] 
1

जेनेरिक, पुनरावर्ती समाधान:

def get_lists_with_sum(length, my_sum): 
    if my_sum == 0: 
     return [[0 for _ in range(length)]] 

    if not length: 
     return [[]] 
    elif length == 1: 
     return [[my_sum]] 
    else: 
     lists = [] 
     for i in range(my_sum+1): 
      rest = my_sum - i 
      sublists = get_lists_with_sum(length-1, rest) 
      for sl in sublists: 
       sl.insert(0, i) 
       lists.append(sl) 

    return lists 

print get_lists_with_sum(11, 8) 
+0

बस इसे चलाने की कोशिश की। ओह, यह धीमा है ... शायद कुछ ऐसी चीज में परिवर्तित हो जो पूर्ण उड़ा हुआ रिकर्सन के बजाय स्टैक का उपयोग करता हो? –

+0

यह निश्चित रूप से कम मूल्यों पर लक्षित है। दिए गए नंबरों के लिए, मुझे लगता है कि यह स्वीकार्य है। इसमें एक कैश बनाना शायद मदद करेगा, क्योंकि तर्क अक्सर दोहराए जाएंगे। अभी भी संभावित संयोजनों की संख्या उच्च मूल्यवान तर्कों के लिए विस्फोट कर देगी। –

+0

तर्कों के साथ '8,11' मैंने इसे मारने से पहले कुछ मिनटों के लिए अपने सीपीयू को फिर से रेखांकित किया। ओपी का जवाब वास्तव में बहुत तेज़ है (बस * बदसूरत *।) –

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