Axxxy Skrevet 4. oktober 2013 Del Skrevet 4. oktober 2013 Hei. Er en "amatør-programmerer" og sliter litt med å løse dette problemet. Case 1 Jeg har en god del lister som jeg vil ha sortert på en spesifikk måte, og jeg trenger å korte koden. Eksempel situasjon: lst1 = [banan, sølv, ku] lst2 = [eple, gull, gris] lst3 = [kiwi, bronse, hest] Greien er at jeg vil gjerne kopiere alle de første elementene i hver liste til en egen liste, alle de 2. elementene i en egen liste, de 3. elementene i en egen liste, osv. For øyeblikket har jeg en god del lister, og ser det upraktisk å skrive det på denne måten: item1, item2, item3 = [], [], [] count = 0 item1.append(lst1[count]) item1.append(lst2[count]) item1.append(lst3[count]) count += 1 item2.append(lst1[count]) ............... Jeg kunne gjort det med en for-loop men syntes fortsatt det ble tungvindt.Er det en lettere måte å gjøre det på? Eller finnes det en innebygd funksjon som gjør dette for meg? Case 2 Er det mulig å lage nye variabler via kode? Altså: count = 0 for i in range(0, 4): var'count' = [] count += 1 Altså, resultatet jeg vil ha ervar0 = [] var1 = [] osv.. Er det mulig? Og på en lett måte? -Daniel Lenke til kommentar
Imsvale Skrevet 4. oktober 2013 Del Skrevet 4. oktober 2013 (endret) Du trenger ikke count = 0 og count += 1 i forbindelse med for-løkker (se kode for case 2). Dette tar løkka seg av automatisk, og er i grunn hele vitsen med for-løkke kontra while-løkke. Case 1: Har du selv forslag til løsning med for-løkke? Kan hende du gjør det på en unødvendig tungvint måte, og da er det sikkert noe å lære. Meget mulig det finnes sorteringsfunksjoner som kan gjøre det du vil her, eller noe lambda-magi, men det kan jeg ikke så mye om. Case 2: varList = [] for i in range(4): varList.append([]) Så aksesserer du dem via indeksering: varList[0], varList[1], osv. Og range(4) betyr det samme som range(0,4). Overflødig å spesifisere at du skal starte på 0. Opprette variabler automatisk tror jeg ikke er mulig, men det er gjerne greit å ha dem i en liste uansett, og da blir det ikke enklere enn det over. Kanskje bortsett fra noen kodetriks som i prinsippet gjør det samme. Endret 4. oktober 2013 av Imsvale Lenke til kommentar
Axxxy Skrevet 4. oktober 2013 Forfatter Del Skrevet 4. oktober 2013 Tja, er på sporet av en løsning hver gang jeg strekker på meg, men da jeg kommer tilbake til PCen, så blir det så forvirrende at jeg glemmer det. Skal se hva jeg får til. Men takk for svar! -Daniel Lenke til kommentar
Imsvale Skrevet 4. oktober 2013 Del Skrevet 4. oktober 2013 Jeg vet ikke hvor mye lærdom det er å hente i dette fremfor å konstruere noe kode som gjør det du vil, men det finnes en funksjon som gjør akkurat det du vil (case 1). zip(lst1, lst2, lst3) Så enkelt, og så meningsløst. Lenke til kommentar
slacky Skrevet 4. oktober 2013 Del Skrevet 4. oktober 2013 (endret) Det å kalde variabler med en strenger er hacky og tregt ikke noe jeg annbefaler deg, det finnes heller ikke dynamisk... Men løsningen er slik: lst1 = ['banan', 'sølv', 'ku'] lst2 = ['eple', 'gull', 'gris'] lst3 = ['kiwi', 'bronse', 'hest'] how_many_lists = 3; print [vars()['lst'+str(x)][0] for x in range(1, how_many_lists+1)] Det er mulig å opprette variabler med streng også, ikke bare kalde dem.>>> vars()['lst' + str(id)] = ['what', 'ever'] Men det er slett ikke en god måte å gjøre det på, krever også at du holder styr over antall variabler, og hver variabel vil gjøre sitt innspill på å gjøre Python-interpreteren tregere en den allerede er... Bruk heller en 2D liste som vist under.. lst = [None]*3 #set størrelsen til 3 lst[0] = ['banan', 'sølv', 'ku'] lst[1] = ['eple', 'gull', 'gris'] lst[2] = ['kiwi', 'bronse', 'hest'] newlist = [x[0] for x in lst] print newlist Det er nok så effektivt som du får det.. Skal du legge til enda en liste så bruker du bare lst.append(['ost', 'kobber', 'sjimpanse']).. map + itergetter, eller lambda kan også brukes i denne sammenheng: lst = [['banan','solv','ku'], ['eple','gull','gris'], ['kiwi','bronse','hest']] shit = [] for i in range(len(lst[0])): shit.append(map(lambda x: x[i], lst)) print shit #Gir deg [['banan', 'eple', 'kiwi'], ['solv', 'gull', 'bronse'], ['ku', 'gris', 'hest']] --------------------------- men det finnes en funksjon som gjør akkurat det du vil (case 1). zip(lst1, lst2, lst3) Så enkelt, og så meningsløst. men, det løser ikke case1 på noen dynamisk måte uansett.. Han må fremdeles skive liste-navn for hånd.. Altså ikke dynamisk, så dermed: 2D-liste fra første stund. Endret 17. oktober 2013 av warpie Lenke til kommentar
Klaga Skrevet 5. oktober 2013 Del Skrevet 5. oktober 2013 lst1 = ["banana", "silver", "cow"] lst2 = ["apple", "gold", "pig"] lst3 = ["kiwi", "bronze", "horse"] lst4 = ["grape", "zinc", "bird"] NUM_OF_ENTRY_TYPES = 3 my_lists = [lst1, lst2, lst3, lst4] my_dic = {} for i in range(NUM_OF_ENTRY_TYPES): my_dic[i] = [] for num_element in range(NUM_OF_ENTRY_TYPES): for num_list in range(len(my_lists)): my_dic[num_element].append(my_lists[num_list][num_element]) print("fruit :", my_dic[0]) print("metals :", my_dic[1]) print("animals:", my_dic[2]) Du kan sikker også løse problemet med 2D lister, men jeg liker å bruke ordbøker (i python: dictionary). lst1 = ["banana", "silver", "cow"] lst2 = ["apple", "gold", "pig"] lst3 = ["kiwi", "bronze", "horse"] lst4 = ["grape", "zinc", "bird"] NUM_OF_ENTRY_TYPES = 3 my_lists = [lst1, lst2, lst3, lst4] my_list_names = ["fruit", "metal", "animal"] my_dic = {} for name in my_list_names: my_dic[name] = [] for num_element in range(len(my_list_names)): for num_list in range(len(my_lists)): my_dic[my_list_names[num_element]].append(my_lists[num_list][num_element]) for name in my_list_names: print(name, " ", my_dic[name]) Lenke til kommentar
snippsat Skrevet 5. oktober 2013 Del Skrevet 5. oktober 2013 (endret) map + itergetter, eller lambda kan også brukes i denne sammenheng: Syns du knoter det til her Ser du noen likheter,gjør det litt mere tungvindt for og få helt lik output(nested list). >>> [list(i) for i in zip(lst1, lst2, lst3)] [['banan', 'eple', 'kiwi'], ['solv', 'gull', 'bronse'], ['ku', 'gris', 'hest']] men, det løser ikke case1 på noen dynamisk måte uansett.. Han må fremdeles skive liste-navn for hånd.. inn der. Altså ikke dynamisk, så dermed: 2D-liste fra første stund. zip() er den opplagte veien og gjøre dette på. Jeg skjønner ikke hva som blir feil aksesserer listene via indeksering etter zip(). Skulle jeg ha gitt navn ville forsatt zip() vært med. >>> lst = zip(lst1, lst2, lst3) >>> d = dict(('lst_{}'.format(n), k[:]) for n,k in enumerate(lst,1)) >>> d {'lst_1': ('banan', 'eple', 'kiwi'), 'lst_2': ('solv', 'gull', 'bronse'), 'lst_3': ('ku', 'gris', 'hest')} >>> d['lst_1'] ('banan', 'eple', 'kiwi') Eller hva med og bruke første element til og aksesserer listene. >>> d = dict((k[0], k[:]) for k in lst) {'banan': ('banan', 'eple', 'kiwi'), 'ku': ('ku', 'gris', 'hest'), 'solv': ('solv', 'gull', 'bronse')} >>> d['solv'] ('solv', 'gull', 'bronse') Tips til begge over range(len(my_lists), range(len(lst[0])) Bruk enumerate(my_lists). Endret 5. oktober 2013 av snippsat 1 Lenke til kommentar
Klaga Skrevet 5. oktober 2013 Del Skrevet 5. oktober 2013 Trodde jeg hadde litt peiling på Python jeg, men jeg har fortsatt langt å gå ser jeg! Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå