มีวิธีรับรายการ int ใหม่จากรายการ ints ที่บวกค่าที่แน่นอนหรือไม่? [ซ้ำ]

Aug 20 2020

ฉันมีรายชื่อของจำนวนเต็มพวกเขาจะถูกจัดเรียงแบบสุ่มและอาจทำซ้ำ: mylist = [5,4,2,4,5,6,7,3,8,3]และค่าบางอย่าง (เช่น: value=35)

ตอนนี้ผมต้องการที่จะได้รับรายชื่อของรายการของจำนวนเต็มออกจากmylistเราชื่อมันsumlistว่ารวมถึงตัวเลือก posible valueทั้งหมดของตัวเลขที่ร่วมกันเพิ่มขึ้น

ดังนั้นเมื่อฉันจะทำ:

sum=0
for i in  sumlist[0]:
   sum+=i

sum == valueTrueจะกลับมา

คำตอบ

E-A Aug 20 2020 at 04:26

Itertools.combinationsจัดการสิ่งนี้ได้ค่อนข้างง่าย เมื่อคุณระบุรายการและความยาวมันจะทำให้ชุดค่าผสมทั้งหมดเป็นไปได้ของความยาวนั้นและไม่เหมือนกับการเรียงสับเปลี่ยนคือจะลบรายการที่ซ้ำกันออกไป เพื่อให้แน่ใจว่าทุกตัวเลือกถูกลองต้องลองแต่ละความยาว (ตั้งแต่ 0 จนถึงสตริงเต็ม) ดังนี้

import itertools
def SumList(MyList,Value):
    for Length in range(1,len(MyList)):          
        for ListOfVals in itertools.combinations(MyList,Length): 
            Total=0
            for num in ListOfVals:
                Total+=num
            if Total==Value:
                
                return(ListOfVals)
                
mylist=[5,4,2,4,5,6,7,3,8,3]
value=35
print(SumList(mylist,value))



>>[5,4,5,6,7,8]

เช่นเดียวกับวิธีการอย่างรวดเร็วสิ่งนี้จะส่งออกชุดค่าผสมที่สั้นที่สุดเสมอโดยดูจากการวนซ้ำตามความยาวจากสั้นที่สุดไปจนถึงยาวที่สุด