/ Indexovanie zoznamu permutácií v Python - python, indexovanie, permutácia

Indexovanie zoznam permutácie Python - python, indexovanie, permutácie

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ď č. 1

Môž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"]