鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: ooxx7788

[技术交流] Python: 每日一题 36

[复制链接]
发表于 2017-5-13 23:04:36 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-23 18:25:53 | 显示全部楼层
如果知道pin=1357,马上想到懒人方法,不过没有通用性
for i in [1,2,4]:
    for j in [2,3,6]:
        for k in [2,4,5,6,8]:
            for m in [4,7,8]:
                print(i,j,k,m)
那还是用个字典存起来,发现itertools模块有计算笛卡尔积的工具
from itertools import product

pins = {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], 9:[6,8,9], 0:[8,0]}

pin = '1357'
# pin = input("请输入密码:")
try:
    # 将输入生成二维列表,再解包,用product工具将笛卡尔积打印出来
    for i in product(*[pins[int(j)] for j in pin]):
        print(i)
except ValueError:
    print("请输入0-9正整数集合!")
然后再试下不用工具,怎么求笛卡尔积,结果只能想到用神奇的eval()函数凑出来
def cartesian_product(times,sets):
    """参数times是列表个数,sets是包含各个列表的列表,返回笛卡尔积"""
    string_1 = "("
    string_2 = ""
    for i in range(times):
        string_1 += "a"*(i+1) + ',' # 最后会多一个逗号,切片去掉
        string_2 += " for "+ "a"*(i+1)+" in "+str(sets[i]) # 确保关键字左右有空格
    # 把字符串组合成列表推导式
    string = "[" + string_1[:-1] + ")" + string_2 + "]"
    output = eval(string)
    print(*output)

a = []
pin = input("请输入数字,我没有写防错,你输入了其他就直接报警哦:")
for j in pin:
    a.append(pins[int(j)]) 
cartesian_product(len(a),a)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-20 11:27:37 | 显示全部楼层
答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-12 11:20:18 | 显示全部楼层
大佬你的题目都好绕啊。。。基本看一遍是看不明白的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-17 10:48:23 | 显示全部楼层
import itertools as t

def getPINs(pin):
    pin = list(pin)
    for i in range(len(pin)):
        if int(pin[i]) == 1:
            pin[i] = [2,4]
        elif int(pin[i]) == 2:
            pin[i] = [1,3,5]
        elif int(pin[i]) == 3:
            pin[i] = [2,6]
        elif int(pin[i]) == 4:
            pin[i] = [1,5,7]
        elif int(pin[i]) == 5:
            pin[i] = [2,4,6,8]
        elif int(pin[i]) == 6:
            pin[i] = [3,5,9]
        elif int(pin[i]) == 7:
            pin[i] = [4,8]
        elif int(pin[i]) == 8:
            pin[i] = [5,7,9,0]
        elif int(pin[i]) == 9:
            pin[i] = [6,8]
        else:
            pin[i] = [8]
    pins = []
    for i in t.product(pin[0],pin[1],pin[2],pin[3]):
        pins.append(i)
    print(pins)


'''pin = input('间谍看到的数字:')'''
pin = '1357'
getPINs(pin)
不知道怎么把product里面加入未知数量的iter
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-27 16:53:30 | 显示全部楼层
有点意思,成功是成功了,但是不好
## 代码
import test
import itertools

def get_pins(x):
    form = [[0,8],[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]]
    n = len(x)
    y = []
    result = []
    for each in x:
        y.append(int(each))
    if n == 1:
        comb = itertools.product(form[y[0]])
    elif n == 2:
        comb = itertools.product(form[y[0]],form[y[1]])
    elif n == 3:
        comb = itertools.product(form[y[0]],form[y[1]],form[y[2]])
    elif n == 4:
        comb = itertools.product(form[y[0]],form[y[1]],form[y[2]],form[y[3]])
    elif n == 5:
        comb = itertools.product(form[y[0]],form[y[1]],form[y[2]],form[y[3]],form[y[4]])
    else:
        return '排列过大'
    for i in comb:
        z = ''
        for j in i:
            z += str(j)
        result.append(z)
    return result
    




## 测试
expectations = [('8', ['5','7','8','9','0']),
                ('11',["11", "22", "44", "12", "21", "14", "41", "24", "42"]),
                ('369', ["339","366","399","658","636","258","268","669","668","266","369","398","256","296","259","368","638","396","238","356","659","639","666","359","336","299","338","696","269","358","656","698","699","298","236","239"])]

for tup in expectations:
  test.assert_equals(sorted(get_pins(tup[0])), sorted(tup[1]), 'PIN: ' + tup[0])

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

使用道具 举报

发表于 2018-7-18 17:53:21 | 显示全部楼层
看看答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 16:50:03 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-13 10:31:48 | 显示全部楼层
虽然有基本思路,但总会卡在某个地方想挺久的,看来还只是刚碰到python的一点点皮毛...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-2 10:26:01 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-18 21:44:08 From FishC Mobile | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-23 21:41:44 | 显示全部楼层
交作业。请问不用模块怎么计算不同长度和可变数量的笛卡尔积。想了一下午没头绪
import itertools
def getPins(PIN=1357):
    dict1 = {'1': '124', '2': '2135', '3': '326', '4': '4157', '5': '52468', '6': '6359', '7': '748', '8': '80579',
             '9': '968', '0': '08'}
    temp = []
    for each in str(PIN):
        temp.append(dict1.get(each))  # 每个数字可能的字符串
    list1 = list(itertools.product(*temp))  # 计算笛卡尔乘积,返回密码的元组
    pinlist = [''.join(each) for each in list1]  # 提取元组字符串拼接
    print(pinlist)
    return pinlist
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 09:41:25 | 显示全部楼层

def Fun36():
    for i in [1,2,4]:
        for j in [3,2,6]:
            for k in [5,2,4,6,8]:
                for g in [7,4,8]
                    print(i,j,k,g)

仅针对该题,的有效组合
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-25 18:13:11 | 显示全部楼层
from functools import reduce
password_dict = {'0': [0, 8], '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': [0, 5, 7, 8, 9], '9': [6, 8, 9]}


def combine_list(list1, list2):
    return [str(i)+str(j) for i in list1 for j in list2]


def f_36(string: str) -> list:
    iter_list = []
    for i in string:
        iter_list.append(password_dict[i])

    return reduce(combine_list, iter_list)


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

使用道具 举报

发表于 2020-6-9 16:15:18 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-13 16:33:06 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 11:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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