มีวิธีรับรายการ int ใหม่จากรายการ ints ที่บวกค่าที่แน่นอนหรือไม่? [ซ้ำ]
ฉันมีรายชื่อของจำนวนเต็มพวกเขาจะถูกจัดเรียงแบบสุ่มและอาจทำซ้ำ: 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 == value
True
จะกลับมา
คำตอบ
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]
เช่นเดียวกับวิธีการอย่างรวดเร็วสิ่งนี้จะส่งออกชุดค่าผสมที่สั้นที่สุดเสมอโดยดูจากการวนซ้ำตามความยาวจากสั้นที่สุดไปจนถึงยาวที่สุด