[Uso diario de Python] uso de itertools.permutations

Gramática estándar

itertools.permutations(iterable[, r])

sentido

Devuelve permutaciones de longitud r sucesivas de elementos en el iterable.

Si r no se especifica o es None, entonces r toma como valor predeterminado la longitud del iterable y se generan todas las posibles permutaciones de longitud completa.

Las permutaciones se emiten en orden lexicográfico. Entonces, si la entrada iterable está ordenada, las tuplas de permutación se producirán en orden ordenado.

Los elementos se tratan como únicos en función de su posición, no de su valor. Entonces, si los elementos de entrada son únicos, no habrá valores repetidos en cada permutación.

En pocas palabras, devuelve los elementos del iterador.Longitud continuaEs la disposición de r. Es decir, todo el arreglo.
Si r no se especifica o Ninguno, entonces r por defecto esLa longitud del iterable, Y generar todas las posibles permutaciones completas.

Código

def permutations(iterable, r=None):
    # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
    # permutations(range(3)) --> 012 021 102 120 201 210
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        return
    indices = range(n)
    cycles = range(n, n-r, -1)
    yield tuple(pool[i] for i in indices[:r])
    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                yield tuple(pool[i] for i in indices[:r])
                break
        else:
            return

Mire este código con atención, creo que puede verlo claramente.

Ejemplo de algoritmo

Aquí podemos ver el código del juego de 24 puntos.

# -*- coding: utf-8 -*-
"""
Created on Wed Jan 20 23:29:53 2021

@author: Administrator
"""
import itertools
def twentyfour(cards):
    for nums in itertools.permutations(cards):
        for ops in itertools.product('+-*/',repeat=3):
            #构造三种中缀表达式 bsd
            bds1 = '({0}{4}{1}){5}({2}{6}{3})'.format(*nums, *ops) #(a+b)*(c-d)
            bds2 = '(({0}{4}{1}){5}{2}){6}{3}'.format(*nums, *ops) #(a+b)*c-d
            bds3 = '{0}{4}({1}{5}({2}{6}{3}))'.format(*nums, *ops) #a/(b-(c/d))
            for bds in [bds1,bds2,bds3]:
                try:
                    if abs(eval(bds)-24.0)<1e-10:   #计算
                        return bds
                except ZeroDivisionError: #除零错误
                    continue
                
    return 'Not fount'

cards = [1,2,3,4]
for card in cards:
    print(twentyfour(card))

Supongo que te gusta

Origin blog.csdn.net/weixin_51656605/article/details/112913422
Recomendado
Clasificación