Avatar billede msdb Nybegynder
06. december 2010 - 20:11 Der er 14 kommentarer og
1 løsning

Python for-loop med liste af lister

Jeg er ikke god til loops og har derfor brug for lidt hjælp.
Min funktion ser indtil videre således ud:

def find(x):
    for w in fxfs:
        if len(x.split()) == 1:
            if x in w:
                print '%r blev fundet %d gang(e) i %r' % (x, w.count(x), w)
                run()
            else:
                print '%r gav ingen resultater' % x
                exit(0)

...hvor fxfs er en liste af lister:
fxfs = [f1, f2, f3, f4, f5]

og x er brugerens input (søgeord i dette tilfælde)

når input matcher et ord som er i f1 f.eks. fungerer det fint, men ikke når jeg forsøger med ord som er i de andre lister.
Hvordan får jeg loopet til at køre alle listerne igennem og ikke kun f1?
Avatar billede arne_v Ekspert
06. december 2010 - 20:23 #1
en for loekke inden i en for loekke?
Avatar billede msdb Nybegynder
06. december 2010 - 20:30 #2
Hvordan vil det se ud?
Avatar billede arne_v Ekspert
06. december 2010 - 20:38 #3
en ydre for loekke for lister i liste af lister

en indre for loekke for tal i liste af tal
Avatar billede arne_v Ekspert
06. december 2010 - 20:38 #4
Jeg kan godt lave et eksempel.
Avatar billede arne_v Ekspert
06. december 2010 - 20:52 #5
demo:

def check(lstlst,target):
    for lst in lstlst:
        for val in lst:
            if val==target:
                return True
    return False

data = [[1,2,3],[4,5,6],[7,9,9]]
print check(data,5)
print check(data,10)
Avatar billede msdb Nybegynder
07. december 2010 - 14:07 #6
Den bid kode løber alle værdierne igennem, men det forhindrer mig i at bruge 'if in'.
Min første tank var at lave en if-betingelse for hver variabel, altså ikke bruge en for-løkke, men istedet skrive if x in f1, if x in f2, osv. Der er dog i alt 15 af disse variabler den skal igennem, så det faldt mig ind at en løkke måtte være løsningen og dit forslag kan jeg ikke få til at fungere sammen med 'if in'.
Avatar billede arne_v Ekspert
07. december 2010 - 19:42 #7
def check(lstlst,target):
    for lst in lstlst:
        if target in lst:
            return True
    return False

data = [[1,2,3],[4,5,6],[7,9,9]]
print check(data,5)
print check(data,10)

?
Avatar billede msdb Nybegynder
07. december 2010 - 19:52 #8
Og hvad hvis jeg vil have funktionen til at tjekke både om 5 er i variablen og om også 5 er i strengen, altså en kombination af dine forslag?
Avatar billede arne_v Ekspert
08. december 2010 - 03:13 #9
def check(lstlst,target):
    for lst in lstlst:
        for val in lst:
            if target in val:
                return True
    return False

data = [['11','22','33'],['44','55','66'],['77','88','99']]
print check(data,'5')
print check(data,'10')


?
Avatar billede msdb Nybegynder
08. december 2010 - 15:09 #10
Jeg kan ikke få det til at fungere. Når jeg tester det ved at printe val så returnerer den kun det første bogstav fra listen, dvs. den tjekker kun om target er i et enkelt bogstav istedet for alle ord i listen.
Avatar billede msdb Nybegynder
08. december 2010 - 15:56 #11
Okay, nu her jeg fået det til at virke, dog et sidste spørgsmål: Hvordan kan jeg tælle hvor mange tilfælde af target der findes i listen? lst.count(target) f.eks. kan ikke finde 'stol' i 'havestol'.
Avatar billede msdb Nybegynder
08. december 2010 - 16:32 #12
Ha, det fandt jeg også en løsning på, tillad mig at formulere et nyt spørgsmål:

def check(lstlst,target):
    tal = 0
    for lst in lstlst:
        for val in lst:
            if target in val:
                tal += 1
                print '%r blev fundet %d gang(e) i %r' % (target, tal, pah(lst))
        return False

Dette returnerer:

'frugt' blev fundet 1 gang(e) i 'foedevarer1.txt'
'frugt' blev fundet 2 gang(e) i 'foedevarer2.txt'
'frugt' blev fundet 3 gang(e) i 'foedevarer2.txt'
'frugt' blev fundet 4 gang(e) i 'foedevarer2.txt'
'frugt' blev fundet 5 gang(e) i 'foedevarer2.txt'
'frugt' blev fundet 6 gang(e) i 'foedevarer2.txt'
'frugt' blev fundet 7 gang(e) i 'foedevarer3.txt'
'frugt' blev fundet 8 gang(e) i 'foedevarer7.txt'
'frugt' blev fundet 9 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 10 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 11 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 12 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 13 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 14 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 15 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 16 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 17 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 18 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 19 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 20 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 21 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 22 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 23 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 24 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 25 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 26 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 27 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 28 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 29 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 30 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 31 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 32 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 33 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 34 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 35 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 36 gang(e) i 'foedevarer11.txt'
'frugt' blev fundet 37 gang(e) i 'foedevarer14.txt'
'frugt' blev fundet 38 gang(e) i 'foedevarer14.txt'
'frugt' blev fundet 39 gang(e) i 'foedevarer14.txt'
'frugt' blev fundet 40 gang(e) i 'foedevarer14.txt'

Hvordan kan jeg få den til at returnere kun det endelige resultat og ikke hele sammentællingen for hver text?
Avatar billede arne_v Ekspert
08. december 2010 - 22:34 #13
ryk print ud så den kaldes efter for løkkerne
Avatar billede arne_v Ekspert
08. december 2010 - 22:34 #14
og et svar
Avatar billede msdb Nybegynder
08. december 2010 - 22:48 #15
Super. Tak for det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester