Tento kód generuje zoznam všetkých permutácií:
def permute(xs, low=0):
if low + 1 >= len(xs):
yield xs
else:
for p in permute(xs, low + 1):
yield p
for i in range(low + 1, len(xs)):
xs[low], xs[i] = xs[i], xs[low]
for p in permute(xs, low + 1):
yield p
xs[low], xs[i] = xs[i], xs[low]
for p in permute(["A", "B", "C", "D"]):
print p
Čo by som chcel vytvoriť index pre zoznam permutácií, takže ak zavolám číslo, môžem získať prístup k tejto konkrétnej permutácii.
Napríklad:
if index.value == 0:
print index.value # ["A","B","C","D"]
elif index.value == 1:
print index.value # ["A","B","D","C"]
#...
Som nový pre Python, ďakujem vopred za akékoľvek poskytnuté pokyny.
odpovede:
0 pre odpoveď č. 1Môžete tiež vytvoriť novú funkciu getperm
získať permutáciu index
z vášho generátora:
def getperm(index,generator):
aux=0
for j in generator:
if aux == index:
return j
else:
aux = aux +1
In: getperm(15,permute(["A", "B", "C", "D"]))
Out: ["C", "A", "D", "B"]
0 pre odpoveď č. 2
Iterátory nepodporujú "náhodný prístup". Musíte previesť svoj výsledok do zoznamu:
perms = list(permute([....]))
perms[index]
0 pre odpoveď č. 3
Ako povedal levi, zdá sa, že chcete použiť slovník. Slovník bude vyzerať takto:
#permDict = {0:["A", "B", "C", "D"], 1:["A", "B", "D", "C"], ...}
permDict = {}
index = 0
for p in permute(["A", "B", "C", "D"]):
permDict[index] = p
index += 1
Potom získate hodnotu podľa kľúča, ktorý ste priradili.
if index == 0:
print permDict[0] # ["A","B","C","D"]
elif index == 1:
print permDict[1] # ["A","B","D","C"]
#...
Alebo len uložte každú permutáciu do zoznamu a zavolajte tieto indexy.
permList = [p for p in permute(["A", "B", "C", "D"])]
#permList[0] = ["A", "B", "C", "D"]
#permlist[1] = ["A", "B","D", "C"]
0 pre odpoveď č. 4
Môžete vytvoriť požadovanú permutáciu priamo (bez toho, aby ste prešli všetky predchádzajúce permutácie):
from math import factorial
def permutation(xs, n):
"""
Return the n"th permutation of xs (counting from 0)
"""
xs = list(xs)
len_ = len(xs)
base = factorial(len_)
assert n < base, "n is too high ({} >= {})".format(n, base)
for i in range(len_ - 1):
base //= len_ - i
offset = n // base
if offset:
# rotate selected value into position
xs[i+1:i+offset+1], xs[i] = xs[i:i+offset], xs[i+offset]
n %= base
return xs
potom
>>> permutation(["A", "B", "C", "D"], 15)
["C", "B", "D", "A"]