WebHU - Programozási kérdések és válaszok

Generáljon minden permutációt külön korlátokkal minden indexhez

Tegyük fel, hogy van egy listánk, például: [3, 2, 1]. A lista összes permutációját szeretném létrehozni a következő formában:

[1, 1, 1], [2, 1, 1], [3, 1, 1], [1, 2, 1], [2, 2, 1] , [3, 2, 1]

bármely n hosszúságú listához. Így az eredeti lista i. elemének értéke az összes permutáció i. elemének értékének felső határa.

Szeretnék egy generátort is használni a yield használatával, mivel a beviteli lista meglehetősen nagy lehet (pl. n = 30).

Eddig valami ilyesmit használtam:

itertools.product(range(1, 5), repeat=5)

Amelynek a következő kimenete van, ha for hurokban használják:

(1, 1, 1, 1, 1), (1, 1, 1, 1, 2), (1, 1, 1, 1, 3), (1, 1, 1, 1, 4), (1, 1, 1, 2, 1), (1, 1, 1, 2, 2), (1, 1, 1, 2, 3), ... 

Azonban nem hiszem, hogy lehetővé teszi egyéni korlátok megadását a permutációk minden eleméhez.

Kérjük, vegye figyelembe, hogy a beviteli lista elemeinek nem kell feltétlenül egymást követő számoknak lenniük, így a [25, 17, 10, 4] egy érvényes bevitel.


  • Miért nem [3,3,3] lehetséges? 27.07.2018
  • @RafaelC Mivel a második elem 2, az összes permutáció második elemének 2-nél kisebbnek vagy egyenlőnek kell lennie. Ennek tisztázása érdekében szerkesztettem a kérdést. 27.07.2018
  • Számít a sorrend? [(1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1), (3, 1, 1), (3, 2, 1)] érvényes megoldás? 27.07.2018
  • @FranciscoCouzo A kimenet sorrendje a kérdésben előnyös lenne, mivel ezek a máshol használt kitevők, és szeretném, ha először a lista bal oldalán jelennének meg a legnagyobb értékek 27.07.2018

Válaszok:


1

Ez a rekurzív függvény egy generátort ad vissza a kívánt sorrendben:

def f(limits):
    if not limits:
        yield ()
        return

    for l in f(limits[1:]):
        for i in range(1, limits[0]+1):
            yield (i,) + l

>>> print(list(f([3, 2, 1])))
[(1, 1, 1), (2, 1, 1), (3, 1, 1), (1, 2, 1), (2, 2, 1), (3, 2, 1)]
26.07.2018

2

Szűrheti a itertools.product eredményeit

>>> from itertools import product
>>> l = [3,2,1]
>>> list(filter(lambda t: all(x<=y for x,y in zip(t,l)), product(l, repeat=len(l))))
[(3, 2, 1), (3, 1, 1), (2, 2, 1), (2, 1, 1), (1, 2, 1), (1, 1, 1)]
26.07.2018
  • Meg tudná mondani, hogy mi a l a példában? 27.07.2018
  • @aL_eX Elnézést.. Frissítve 27.07.2018
  • Ez valóban nem hatékony, nagyon sok sort generál, amelyeket egyszerűen eldobnak 27.07.2018
  • Ezenkívül úgy gondolom, hogy az általános esetre a repeat=3-t repeat=len(l)-re kell cserélni. 27.07.2018
  • @aL_eX. Kösz. Frissítve 27.07.2018

  • 3

    Egy csomó tartomány derékszögű szorzatát keresi, amelyek argumentumát a bemeneti lista határozza meg:

    from itertools import product
    lims = [3, 2, 1]
    gen = product(*(range(1,lim+1) for lim in lims))
    print(list(gen))
    

    Az eredmény az

    [(1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1), (3, 1, 1), (3, 2, 1)]
    
    26.07.2018
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..