zoukankan      html  css  js  c++  java
  • Python:每日一题001

    题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

    **程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。

    个人解题思路

    利用排列组合知识算出总共有4X3X2= 24个数,构造每个数加入列表中,打印输出。

      import random
      li = ["1","2","3","4"]
      all_sum_num = 4*4*4
      new_sum_list = []
      for i in range(all_sum_num):
          choose_li =  random.sample(li,3)
          new_num_str = "".join(choose_li)
          new_sum_list.append(new_num_str)
      num_set = set(new_sum_list)
      num_str_list =  list(num_set)
      print(num_str_list)
      print(len(num_str_list))
    

      

    分析:这种写法有个漏洞,就是随机取出的3个数并不能完全取完所有可能的数,造成结果不唯一,每次运行程序可能结果都不一致。

    参考解答方法:

      li = []
      for i in range(1,5):
          for j in range(1,5):
              for k in range(1,5):
                  if i != k and i != j and j != k:
                      num = i*100 + j*10 + k
                      li.append(num)
      ​
      print(li)
      print(len(li))
    

      

    分析:用3个for循环,加上if条件判断,将产生的数加入列表即可

    上述代码可以继续精简

      
      li1 = [1,2,3,4]
      li2  = [a*100 + b*10 +c for a in li1 for b in li1 for c in li1 if a != b and a != c and b != c]
      print(li2)
      print(len(li2))
    

      

    分析:采用列表解析式,分别对百位、十位、个位的数字进行生成并合成列表的元素。

    相关知识:

    列表解析式

    列表解析式,也可以叫列表推导式

    语法

      
    [expression for iter_var in iterable1]



    [expression for iter_var2 in iterable2 ...

                      for iter_varN in iterableN]


    [expression for iter_var in iterable1

                      if condition]

    列表解析式是将一个可迭代对象(如列表)转换成另一个列表的工具。在转换过程中,可以指定元素必须符合某一条件,并按照指定的表达式进行转换,才能添加至新的列表中。

    例子1

      
      #生成1*1,2*2,3*3,4*4,5*5,6*6,9*9的序列
      li1 = [x*x for x in range(1,11)]
      print(li1)
    

      

    例子2

    使用两层循环的情况

      
      li1 = [m+n for m in range(3) for n in range(2)]
      print(li1)
      ​
      #li1的列表解析式等价于下面的嵌套for循环,即m是来自于第一个for循环,n的数值是来自于第二个for循环
      li2 = []
      for i in range(3):
          for j in range(2):
              num = i+j
              li2.append(num)
      print(li2)
    

      

    例子3

      
      #获取列表中嵌套列表的元素,生成一个无嵌套的新列表
      li3=[[1,2],[3,4,5],[6,7],[8]]
      print([x  for i in li3 for x in i]) 
    

      

    例子4

      
      # 获取两个列表对应位的乘积
      lia=[2,3,4,5]
      lib=[3,4,5,6]
      zip_li = zip(lia,lib)
      print(zip_li) #这里产生的zip对象是两个一一对应的元组,可以用for循环取出来
      print([i*j for i,j in zip(lia,lib)])
    

      

    例子5

      
      # 获取文本中所有单词的第1个字符
      text = "Alibaba founder Jack Ma laughs off AC Milan football club purchase rumors"
      first_charts=[word[0] for word in text.split()]
      print(first_charts)
    

      

    例子6

    列表生成式加三元运算

      
      # 将列表中所有能转化为数字的字符串转化为数字
      lix = ['1','2','3','i','8']
      liy = [int(x)if x.isdigit()else x for x in lix]
      print(liy)
     
    

    例子7

      # 将列表中小于5的数*10
      lic = [1,3,4,10,18]
      print([x*10 for x in lic if x < 5 ])
      #注意这里是列表解析式,只是加上了条件判断,注意与列表解析式加三元运算的区别,这里加不了else
      print([x*10 if x < 5 else x for x in lic])
      #也可以改写成列表解析加三元运算
    

      

    (本文编号001,首发于2018年9月11日,修改于2018年9月12日)

     

  • 相关阅读:
    UVA 12546 LCM Pair Sum
    两两间的距离都是整数的点集
    Codeforces 11.27
    Codeforces 11.27 B
    UVA 105
    打印自身的程序
    Interval DP
    Tree DP
    参加第五次全国工程建设行业信息化建设高峰论坛 (个人的一点感想)
    基础资料分类及清单版本管理
  • 原文地址:https://www.cnblogs.com/Nicholas0707/p/9630924.html
Copyright © 2011-2022 走看看