鱼C论坛

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

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

[复制链接]
发表于 2017-9-5 15:57:35 | 显示全部楼层
古堡主人。 发表于 2017-9-5 14:52
感觉这句好复杂,能不能讲讲这个句话怎么执行的
  1. from itertools import product
  2. print(len(['^_^' for each in product(range(1,19), repeat=3) if sum(each)==20]))
复制代码

这句吗?
len()函数里面包含的是一个列表推导式,计算所有符合条件的数量。
这个列表推导式由一个for循环构成,把满足条件的子项挑选出来标记为"^_^",其实无论标记什么都是可以不影响最终结果。而这个for循环的可迭代对象是调用了itertools库的product函数生成由3个1~18的数字组成的集合。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-9-5 16:29:54 | 显示全部楼层
每天一题,提高自己。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢你,回答很详细
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

大概可以理解成只要符合if条件就往列表中存放一个^_^然后统计列表个数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-5 18:22:22 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-9-5 18:41:32 | 显示全部楼层
初学者路过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的
小甲鱼最新课程 -> https://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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 16:38:49 | 显示全部楼层
  1. def count():
  2.     for i in range(1,20):
  3.         for m in range(1,20):
  4.             for x in range(1,20):
  5.                 if i+m+x==20:
  6.                     print(i,m,x,sep=' ')
  7.                
  8. print(count())
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 16:42:46 | 显示全部楼层
  1. count = 0
  2. for i in range(1, 19):
  3.     for j in range(1, 20 - i):
  4.         print(i, j, 20 - i - j)
  5.         count += 1
  6. print('总共有%d种排列'%count)
复制代码

这样做减少了一次循环啊,我只想了加,没想到减

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-11 19:33:27 From FishC Mobile | 显示全部楼层
还是不知道
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-13 09:20:52 From FishC Mobile | 显示全部楼层
看答案
小甲鱼最新课程 -> https://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):

这个效率会不会很低
小甲鱼最新课程 -> https://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)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  22. ##    共有33种不重复的组合。
  23. ##    (2, 9, 9)
  24. ##    (4, 8, 8)
  25. ##    (6, 7, 7)
  26. ##    (8, 6, 6)
  27. ##    (10, 5, 5)
  28. ##    (12, 4, 4)
  29. ##    (14, 3, 3)
  30. ##    (16, 2, 2)
  31. ##    (18, 1, 1)
  32. ##    (1, 2, 17)
  33. ##    (1, 3, 16)
  34. ##    (1, 4, 15)
  35. ##    (1, 5, 14)
  36. ##    (1, 6, 13)
  37. ##    (1, 7, 12)
  38. ##    (1, 8, 11)
  39. ##    (1, 9, 10)
  40. ##    (2, 3, 15)
  41. ##    (2, 4, 14)
  42. ##    (2, 5, 13)
  43. ##    (2, 6, 12)
  44. ##    (2, 7, 11)
  45. ##    (2, 8, 10)
  46. ##    (3, 4, 13)
  47. ##    (3, 5, 12)
  48. ##    (3, 6, 11)
  49. ##    (3, 7, 10)
  50. ##    (3, 8, 9)
  51. ##    (4, 5, 11)
  52. ##    (4, 6, 10)
  53. ##    (4, 7, 9)
  54. ##    (5, 6, 9)
  55. ##    (5, 7, 8)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-4 16:22:29 | 显示全部楼层
你的解法好像有重复。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-29 12:05:44 | 显示全部楼层
  1. from itertools import product
  2. it = product(range(1,21),repeat=3)
  3. rs = []
  4. for x in it:
  5.     if sum(x) == 20 and sorted(x) not in rs:
  6.         rs.append(sorted(x))
  7. print(len(rs))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-29 14:23:49 | 显示全部楼层
看高手答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  11. fun88(20)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. print(f_88())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 19:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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