鱼C论坛

 找回密码
 立即注册
查看: 1176|回复: 6

[已解决]itertools内的product(iter1,iter2......iter[n])

[复制链接]
发表于 2018-5-17 19:25:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小庆子 于 2018-5-17 19:26 编辑
  1. '''
  2. # ┌───┬───┬───┐
  3. # │ 1│ 2 │ 3 │
  4. # ├───┼───┼───┤
  5. # │ 4 │ 5 │ 6 │
  6. # ├───┼───┼───┤
  7. # │ 7 │ 8 │ 9 │
  8. # └───┼───┼───┘
  9. #       │ 0 │
  10. #      └───┘
  11. 好了,警探,我们的一个同事成功地观察到了我们的目标人,Robby抢劫犯。我们跟着他来到一个秘密仓库,在那里我们假设能找到所有偷来的东西。
  12. 这个仓库的门是由一个电子组合锁锁闭的(键盘如上图)。不幸的是,我们的间谍不确定他看到当罗比进入它的时候那个PIN。
  13. 他指出,PIN 1357,但他也说,他看到的每一个数字可能实际上是另一个相邻的数字(水平或垂直,但不是对角)。
  14. 例如1,它也可以是2或4。
  15. 例如5,它也可以是2、4、6或8。
  16. 他也提到过,他知道这种锁。你可以输入无限数量的错误的,它们永远不会锁定系统或发出警报。这就是为什么我们可以尝试所有可能的变化。
  17. 观察到的可能是PIN本身和所有的变化考虑相邻的数字
  18. 你能帮我们找出这些变化吗?如果有一个函数,它会返回一个所有变量的数组,其长度为1到8位。
  19. 我们可以命名函数getPINs(python中的get_pins)。但是请注意,所有的PIN,观察到的和结果,都必须是字符串,因为有可能以“0”开头。我们已经为您准备了一些测试用例。
  20. 警探,我们指望你了!
  21. '''
  22. import itertools as t

  23. def getPINs(pin):
  24.     Dict = {'1':[2,4],'2':[1,3,5],'3':[2,6],'4':[1,5,7],'5':[2,4,6,8],'6':[3,5,9],'7':[4,8],'8':[5,7,9,0],'9':[6,8],'0':[8]}
  25.     pin = list(pin)                                   #将传入的Pin转化为列表
  26.     for i in range(len(pin)):
  27.         if pin[i] in Dict:
  28.             pin[i] = Dict.get(pin[i])                 #将Pin对应的数字转化为相对于可能的数字的列表
  29.     pins = []
  30.     for x in t.product(pin[0],pin[1],pin[2],pin[3]):  #组合可能的结果
  31.         pins.append(x)
  32.     print(pins)

  33. '''pin = input('间谍看到的数字:')'''
  34. pin = '1357'
  35. getPINs(pin)
复制代码


最后一步中(组合可能的结果)product()括号里面有四个,分别是pin[0],pin[1],pin[2],pin[3]
如果传入的字符是8个数字,那它就解决不了了
有什么办法能够在product里面随着传入的数字多少相应组合pin[0],pin[1],pin[2],pin[3]......pin[n]呢?
最佳答案
2018-5-18 09:13:02
  1. import itertools as t

  2. def getPINs(pin):
  3.     D = {'1':[1,2,4],'2':[1,2,3,5],'3':[2,3,6],'4':[1,4,5,7],'5':[2,4,5,6,8],'6':[3,5,6,9],'7':[4,7,8],'8':[5,7,8,9,0],'9':[6,8,9],'0':[0,8]}
  4.     population = []
  5.     [population.append(D[i]) for i in pin]
  6.     for x in t.product(*population):  #组合可能的结果
  7.         print(x)

  8. '''pin = input('间谍看到的数字:')'''
  9. pin = '83571257'
  10. getPINs(pin)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-17 23:33:17 | 显示全部楼层
#里只能手动列举product()参数,如pin[0],pin[1]...pin[n],
#因为括号内传入的是n个参数,而不是长度为n的数列,如果是数列,可以用
#pin[i] for i in range(len(pin)),但是这里行不通

import itertools as t

def getPINs(pin):
    Dict = {'1':[2,4],'2':[1,3,5],'3':[2,6],'4':[1,5,7],'5':[2,4,6,8],'6':[3,5,9],'7':[4,8],'8':[5,7,9,0],'9':[6,8],'0':[8]}
    pin = list(pin)                                   #将传入的Pin转化为列表
    for i in range(len(pin)):
        if pin[i] in Dict:
            pin[i] = Dict.get(pin[i])  #将Pin对应的数字转化为相对于可能的数字的列表
    pins = []
    for x in t.product(pin[0],pin[1],pin[2],pin[3],pin[4],pin[5],pin[6],pin[7],pin[8]):  #组合可能的结果
        pins.append(x)
    print(pins)
    print (len(pins))

'''pin = input('间谍看到的数字:')'''
pin = '134567892'
getPINs(pin)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 08:58:23 | 显示全部楼层
本帖最后由 久疤K 于 2018-5-18 09:10 编辑
  1. import itertools as t

  2. Dict = {'1':[2,4],'2':[1,3,5],'3':[2,6],'4':[1,5,7],'5':[2,4,6,8],'6':[3,5,9],'7':[4,8],'8':[5,7,9,0],'9':[6,8],'0':[8]}

  3. def count_resoult(pin):
  4.     r = 1
  5.     for x in pin:
  6.         r *= len(Dict[x])
  7.     return r
  8.    
  9. def getPINs(pin):
  10.     pin = list(pin)                                   #将传入的Pin转化为列表
  11.     for i in range(len(pin)):
  12.         if pin[i] in Dict:
  13.             pin[i] = Dict.get(pin[i])                 #将Pin对应的数字转化为相对于可能的数字的列表
  14.     pins = []
  15.     for x in t.product( *pin ):  #组合可能的结果
  16.         x = ''.join( [str(i) for i in x] )            #转化为字符串
  17.         pins.append( x )
  18.     # print(pins)
  19.     return pins

  20. '''pin = input('间谍看到的数字:')'''
  21. pin = '135780029'
  22. pins = getPINs(pin)

  23. print( len(pins) )
  24. print( 'check:', len(pins) == count_resoult(pin) )
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 09:13:02 | 显示全部楼层    本楼为最佳答案   
  1. import itertools as t

  2. def getPINs(pin):
  3.     D = {'1':[1,2,4],'2':[1,2,3,5],'3':[2,3,6],'4':[1,4,5,7],'5':[2,4,5,6,8],'6':[3,5,6,9],'7':[4,7,8],'8':[5,7,8,9,0],'9':[6,8,9],'0':[0,8]}
  4.     population = []
  5.     [population.append(D[i]) for i in pin]
  6.     for x in t.product(*population):  #组合可能的结果
  7.         print(x)

  8. '''pin = input('间谍看到的数字:')'''
  9. pin = '83571257'
  10. getPINs(pin)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-18 12:33:54 | 显示全部楼层

population 那一段有一点迷 append 外面加个[ ]的作用是啥?还有噢 就是product(*iter) 就是会加入iter的所有元素吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 13:27:46 From FishC Mobile | 显示全部楼层
小庆子 发表于 2018-5-18 12:33
population 那一段有一点迷 append 外面加个[ ]的作用是啥?还有噢 就是product(*iter) 就是会加入iter的 ...

手机打代码不易 这样你可能容易理解一点
import itertools as t

def getPINs(pin):
    D = {'1':[1,2,4],'2':[1,2,3,5],'3':[2,3,6],'4':[1,4,5,7],'5':[2,4,5,6,8],'6':[3,5,6,9],'7':[4,7,8],'8':[5,7,8,9,0],'9':[6,8,9],'0':[0,8]}
    population = list(map(lambda x : D[x],pin))
    for x in t.product(*population):  #组合可能的结果
        print(x)

'''pin = input('间谍看到的数字:')'''
pin = '8357642'
getPINs(pin)
*population 为可变参数
在Python函数中,可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-18 19:34:01 | 显示全部楼层
yjsx86 发表于 2018-5-18 13:27
手机打代码不易 这样你可能容易理解一点
import itertools as t

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 17:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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