![](/img/trans.png)
[英]How to sum first and last element in list to get 2 digit number in the end?
[英]how get list of all the possible combinations of 4 digit numbers whose individual digit sum is 13 and last digit is 5 in that number
如何獲得 4 位數字的所有可能組合,其單個數字總和為 13,最后一位數字為 5?
我在 python 中嘗試如下:
nmz = []
for i in range(1000,10000):
if ((sum(int(j) for j in str(i))==13) & (i % 10)):
nmz = nmz.append(i)
return(nmz)
else:
continue
我收到錯誤,無法獲得預期的 output:
nmz = [1165, 1345, 1435, 1615, 1705, 2245, 2425, 3055 ..... ]
錯誤是:
將范圍從 1000 開始是沒有意義的,因為它不滿足數字應以 5 結尾的重要標准。因此,從 1005 開始並以 10 為增量。因此:
mylist = []
for i in range(1_005, 10_000, 10):
if sum(int(d) for d in str(i)) == 13:
mylist.append(i)
print(mylist)
Output:
[1075, 1165, 1255, 1345, 1435, 1525, 1615, 1705, 2065, 2155, 2245, 2335, 2425, 2515, 2605, 3055, 3145, 3235, 3325, 3415, 3505, 4045, 4135, 4225, 4315, 4405, 5035, 5125, 5215, 5305, 6025, 6115, 6205, 7015, 7105, 8005]
使用不需要int
-> str
轉換的itertools.product
更快的替代方案:
from itertools import product
[sum(a*10**b for a,b in zip(reversed(i), range(len(i)))) # decimal integer from individual integers
for i in product(range(1,10), range(10), range(10), [5]) # all combinations
if sum(i)==13] # condition to keep
output:
[1075, 1165, 1255, 1345, 1435, 1525, 1615, 1705, 2065, 2155, 2245, 2335, 2425, 2515, 2605, 3055, 3145, 3235, 3325, 3415, 3505, 4045, 4135, 4225, 4315, 4405, 5035, 5125, 5215, 5305, 6025, 6115, 6205, 7015, 7105, 8005]
任意位數的版本:
from itertools import product
DIGITS = 4
[sum(a*10**b for a,b in zip(reversed(i), range(len(i))))
for i in product(range(1,10), *([range(10)]*(DIGITS-2)), [5])
if sum(i)==13]
這個答案,尤其是@keyllbundy 評論中的建議比其他當前發布的答案要快得多,所有 python 用戶都應該理解這些利用itertools
的技術。 如果您想查看它們的速度有多快,可以使用timeit
模塊,例如:
import timeit
setup = """
import itertools
def olvin_roght():
mylist = []
for i in range(1_005, 10_000, 10):
if sum(int(d) for d in str(i)) == 13:
mylist.append(i)
return mylist
def jonsg():
return [10*i+5 for i in range(100, 1000) if sum(int(j) for j in str(i)) == 8]
def mozway():
DIGITS = 4
return [
sum(a*10**b for a,b in zip(reversed(i), range(len(i))))
for i in itertools.product(range(1,10), *([range(10)]*(DIGITS-2)), [5])
if sum(i)==13
]
def kelly_bundy():
return [(1+a) * 1000 + (b-a) * 100 + (7-b) * 10 + 5
for a, b in itertools.combinations_with_replacement(range(8), 2)]
"""
print(f"olvin_roght: {timeit.timeit('olvin_roght()', setup=setup, number=10_000)}")
print(f"jonsg: {timeit.timeit('jonsg()', setup=setup, number=10_000)}")
print(f"mozway: {timeit.timeit('mozway()', setup=setup, number=10_000)}")
print(f"kelly_bundy: {timeit.timeit('kelly_bundy()', setup=setup, number=10_000)}")
這應該會顯示如下結果:
olvin_roght: 8.36
jonsg: 7.19
mozway: 1.70
kelly_bundy: 0.08
一種稍微替代的方法是從以下方面重新構建問題:
獲取 4 位數字的所有可能組合的列表,這些數字的各個數字總和為 13,最后一位數字為 5
作為:
獲取總和為 8 的所有 3 位數字。
然后我們可以這樣做:
results = [i*10+5 for i in range(100, 1000) if sum(int(j) for j in str(i)) == 8]
或格式化為:
results = [
i * 10 + 5
for i
in range(100, 1000)
if 8 == sum(
int(j)
for j
in str(i)
)
]
還給我們:
[1075, 1165, 1255, 1345, 1435, 1525, 1615, 1705, 2065, 2155, 2245, 2335, 2425, 2515, 2605, 3055, 3145, 3235, 3325, 3415, 3505, 4045, 4135, 4225, 4315, 4405, 5035, 5125, 5215, 5305, 6025, 6115, 6205, 7015, 7105, 8005]
您可以通過以下方式找到所有答案:
nums = []
for i in range(1000,10000):
sumi = (sum([int(j) for j in str(i)])) # sum of i digits
i_l = i % 10 # i last digit
if i_l == 5 and sumi == 13:
nums.append(i)
print (nums)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.