鱼C论坛

 找回密码
 立即注册
楼主: 冬雪雪冬

[技术交流] Python:每日一题 88(答题领鱼币)

[复制链接]
发表于 2017-9-5 15:57:35 | 显示全部楼层
古堡主人。 发表于 2017-9-5 14:52
感觉这句好复杂,能不能讲讲这个句话怎么执行的
from itertools import product
print(len(['^_^' for each in product(range(1,19), repeat=3) if sum(each)==20]))
这句吗?
len()函数里面包含的是一个列表推导式,计算所有符合条件的数量。
这个列表推导式由一个for循环构成,把满足条件的子项挑选出来标记为"^_^",其实无论标记什么都是可以不影响最终结果。而这个for循环的可迭代对象是调用了itertools库的product函数生成由3个1~18的数字组成的集合。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-9-5 16:29:54 | 显示全部楼层
每天一题,提高自己。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-5 17:12:36 | 显示全部楼层
jerryxjr1220 发表于 2017-9-5 15:57
这句吗?
len()函数里面包含的是一个列表推导式,计算所有符合条件的数量。
这个列表推导式由一个for ...

谢谢你,回答很详细
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-5 17:31:46 | 显示全部楼层
jerryxjr1220 发表于 2017-9-5 15:57
这句吗?
len()函数里面包含的是一个列表推导式,计算所有符合条件的数量。
这个列表推导式由一个for ...

大概可以理解成只要符合if条件就往列表中存放一个^_^然后统计列表个数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-5 18:22:22 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-5 18:41:32 | 显示全部楼层
初学者路过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-5 20:23:31 From FishC Mobile | 显示全部楼层
古堡主人。 发表于 2017-9-5 17:31
大概可以理解成只要符合if条件就往列表中存放一个^_^然后统计列表个数

是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 08:40:41 | 显示全部楼层
num= 0
for a in range(1,19):
    for b in range(1,19):
        for c in range(1,19):
            if( a+b+c )== 20:
                print("%d %d %d" % (a,b,c))----------只到这一步可打印全部符合条件的数组
                num+=1
print("符合条件的数组共有%d种"%num)

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
冬雪雪冬 + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 16:38:49 | 显示全部楼层
def count():
    for i in range(1,20):
        for m in range(1,20):
            for x in range(1,20):
                if i+m+x==20:
                    print(i,m,x,sep=' ')
                
print(count())

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
冬雪雪冬 + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 16:42:46 | 显示全部楼层
count = 0
for i in range(1, 19):
    for j in range(1, 20 - i):
        print(i, j, 20 - i - j)
        count += 1
print('总共有%d种排列'%count)
这样做减少了一次循环啊,我只想了加,没想到减

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
冬雪雪冬 + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-11 19:33:27 From FishC Mobile | 显示全部楼层
还是不知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-13 09:20:52 From FishC Mobile | 显示全部楼层
看答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-27 00:45:35 From FishC Mobile | 显示全部楼层
suloman 发表于 2017-8-31 16:49
t = 0
for i in range(1,19):
    for j in range(1,19):

这个效率会不会很低
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-27 01:33:57 From FishC Mobile | 显示全部楼层
n = 20
count=0
for a in (1,n-1):
       k  =  n -a
       for b in (1,k):
              c = k-b
              count+=1
              print("(%d,%d,%d)\n" %(a,b,c))
print("一共%d次" %count)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-4 16:21:09 | 显示全部楼层
def getAll(targetSum):
##    三种情况:
##    1.a+a+a = targetSum
##    2.a+b+b = targetSum
##    3.a+b+c = targetSum
    result = []
    if (targetSum//3) * 3 == targetSum:
        result.append((targetSum//3,targetSum//3,targetSum//3))
    for i in range(1,targetSum-1):
        if ((targetSum-i)//2) * 2 == targetSum - i:
            result.append((i, (targetSum-i)//2,(targetSum-i)//2))
    for i in range(1, targetSum):
        for j in range(1, targetSum):
            for k in range(1, targetSum):
                if i<j<k and i+j+k == targetSum:
                    result.append((i,j,k))
    return result

s = getAll(20)
print('共有{}种不重复的组合。'.format(len(s)))
for i in s:
    print(i)

##    共有33种不重复的组合。
##    (2, 9, 9)
##    (4, 8, 8)
##    (6, 7, 7)
##    (8, 6, 6)
##    (10, 5, 5)
##    (12, 4, 4)
##    (14, 3, 3)
##    (16, 2, 2)
##    (18, 1, 1)
##    (1, 2, 17)
##    (1, 3, 16)
##    (1, 4, 15)
##    (1, 5, 14)
##    (1, 6, 13)
##    (1, 7, 12)
##    (1, 8, 11)
##    (1, 9, 10)
##    (2, 3, 15)
##    (2, 4, 14)
##    (2, 5, 13)
##    (2, 6, 12)
##    (2, 7, 11)
##    (2, 8, 10)
##    (3, 4, 13)
##    (3, 5, 12)
##    (3, 6, 11)
##    (3, 7, 10)
##    (3, 8, 9)
##    (4, 5, 11)
##    (4, 6, 10)
##    (4, 7, 9)
##    (5, 6, 9)
##    (5, 7, 8)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-4 16:22:29 | 显示全部楼层
你的解法好像有重复。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-29 12:05:44 | 显示全部楼层
from itertools import product
it = product(range(1,21),repeat=3)
rs = [] 
for x in it:
    if sum(x) == 20 and sorted(x) not in rs:
        rs.append(sorted(x))
print(len(rs))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-29 14:23:49 | 显示全部楼层
看高手答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-2 15:43:59 | 显示全部楼层
def fun88(sum1):
    array = []
    for i in range(1,sum1):
        for j in range(1,sum1):
            temp = sum1 - i - j
            if temp > 0 and sorted([i,j,temp]) not in array:
                array.append([i,j,temp])

    for each in array:
        print(each)
    print("数字{}一共有{}种可能排列".format(sum1,len(array)))

fun88(20)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 16:55:39 | 显示全部楼层
def f_88():
    return len([[i, j, 20-i-j] for i in range(1, 20) for j in range(1, 20-i)])

print(f_88())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 06:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表