Multi-variabel Liste Forståelse

Jeg arbejder på Project Euler #35, og jeg er nødt til at finde den cirkulære permutationer af et nummer. Hjælp itertools, kan jeg nemt få den permutationer af et nummer. Men jeg ønsker at gøre det med en liste forståelse (som det synes af mere Pythonic; jeg forsøger også at blive fortrolig med liste forståelser).

Jeg fandt, at alle cirkulære primtal kan kun indeholder cifrene 1, 3, 7, og 9 (dette udelukker 2 og 5, som er cirkulær primtal definition). Hvis nogen andre ciffer blev i antallet (0, 2, 4, 5, 6, eller 8) et af de permutationer, ville ikke være en prime (som der ciffer ville være den sidste i mindst en af permutationerne).

Således, jeg har prøvet at gøre dette:

from itertools import permutations
l = [x for x in list(permutations('1397', y)) for y in range(7)]

Jeg havde brug for at bruge y for y in range(7), så jeg får varierende længder af permutationer.

Men det gav mig en TypeError:

Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    l = [x for x in list(permutations('1397', y)) for y in range(7)]
TypeError: an integer is required

Det virker, men det er ikke ved hjælp af to variable i en liste forståelse:

l = []
for y in range(7):
    l.append([x for x in list(permutations('1379', y))])

Hvordan kan jeg gøre en dobbelt-variabel liste forståelse? Tak!

Tip: indlejrede liste forståelser har samme for for som indlejrede løkker. for y in range(7): for x in permutations('1397', y): newlist.append(x) bliver newlist = [x for y in range(7) for x in permutations('1397', y)].
list(permutations('1379', y)) er allerede en liste, for-løkke: [x for x in list(permutations('1379', y))] er ubrugelig.
Du bør ikke anvende itertools.permitations på alle. Problemet er at finde cirkulære permutationer, som er en særlig form for permutation. Det er meget nemmere at generere dem direkte, uden at itertools.permutation (du bliver nødt til at filtrere resultaterne, ellers). Også ved hjælp af særlige python Standard library funktioner er ikke passende for øvelser, som du forsøger at løse

OriginalForfatteren Rushy Panchal | 2013-01-19

2 svar

  1. 14

    Den for y in range(7) del skulle komme før permutation loop.:

    l = [x for y in range(7) for x in list(permutations('1397', y))]

    Ovenstående liste forståelse svarer til :

    In [93]: l = []
    
    In [94]: for y in range(7):
        ...:     l.extend(list(permutations('1397', y)))

    For eksempel:

    In [76]: l = [x for y in range(3) for x in list(permutations('1397', y))]
    
    In [77]: l
    Out[77]: 
    [(),
     ('1',),
     ('3',),
     ('9',),
     ('7',),
     ('1', '3'),
     ('1', '9'),
     ('1', '7'),
     ('3', '1'),
     ('3', '9'),
     ('3', '7'),
     ('9', '1'),
     ('9', '3'),
     ('9', '7'),
     ('7', '1'),
     ('7', '3'),
     ('7', '9')]

    Og list-comprehension version til din erhvervsaktive eksempel,

    l = []
    for y in range(7):
        l.append(list(permutations('1397', y)))

    er:

    In [85]: l = [list(permutations('1397', y)) for y in range(3)]
    
    In [86]: l
    Out[86]: 
    [[()],
     [('1',), ('3',), ('9',), ('7',)],
     [('1', '3'),
      ('1', '9'),
      ('1', '7'),
      ('3', '1'),
      ('3', '9'),
      ('3', '7'),
      ('9', '1'),
      ('9', '3'),
      ('9', '7'),
      ('7', '1'),
      ('7', '3'),
      ('7', '9')]]

    OriginalForfatteren Ashwini Chaudhary

  2. 3
    [list(permutations('1397',x)) for x in range(7)]
    kan jeg nu, hvorfor votedown?? mens begge resultater er den samme.
    Jeg er ikke sikker på, hvorfor nogen downvoted dette, men et +1 fra mig.
    Dette resultat er kun det samme, da det oprindelige spørgsmål har [x for x in ...]. Den måde jeg ser det, er det tanken, at der er en indlejret liste forståelse, hvilket vil give mulighed for noget som [x*x for x in ...], hvilket ikke er muligt med dette svar. Måske du kan nøjes med at introducere dit svar med noget i retning af “du må ikke bruge en indlejret liste forståelse, bare brug dette:”.

    OriginalForfatteren namit

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *