jerryxjr1220 发表于 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的数字组成的集合。

a512540 发表于 2017-9-5 16:29:54

每天一题,提高自己。

古堡主人。 发表于 2017-9-5 17:12:36

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

谢谢你,回答很详细

古堡主人。 发表于 2017-9-5 17:31:46

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

大概可以理解成只要符合if条件就往列表中存放一个^_^然后统计列表个数

一个热爱学习的 发表于 2017-9-5 18:22:22

看看

liyaya 发表于 2017-9-5 18:41:32

初学者路过

jerryxjr1220 发表于 2017-9-5 20:23:31

古堡主人。 发表于 2017-9-5 17:31
大概可以理解成只要符合if条件就往列表中存放一个^_^然后统计列表个数

是的

siemens2 发表于 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)

qlm0216 发表于 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())

qlm0216 发表于 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)
这样做减少了一次循环啊,我只想了加,没想到减

lihuayuan 发表于 2017-9-11 19:33:27

还是不知道

谱写未来 发表于 2017-9-13 09:20:52

看答案

风中风中 发表于 2017-9-27 00:45:35

suloman 发表于 2017-8-31 16:49
t = 0
for i in range(1,19):
    for j in range(1,19):


这个效率会不会很低

风中风中 发表于 2017-9-27 01:33:57

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)

shigure_takimi 发表于 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)

shigure_takimi 发表于 2017-12-4 16:22:29

你的解法好像有重复。

yjsx86 发表于 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))

43731370 发表于 2018-1-29 14:23:49

看高手答案

咕咕鸡鸽鸽 发表于 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() not in array:
                array.append()

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

fun88(20)

Geoffreylee 发表于 2020-3-18 16:55:39

def f_88():
    return len([ for i in range(1, 20) for j in range(1, 20-i)])

print(f_88())
页: 1 2 [3] 4
查看完整版本: Python:每日一题 88(答题领鱼币)