Gå til innhold

Anbefalte innlegg

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 er
var0 = []

var1 = []

osv..

 

Er det mulig? Og på en lett måte?

 

-Daniel :)

Lenke til kommentar
Videoannonse
Annonse

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 av Imsvale
Lenke til kommentar

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 av warpie
Lenke til kommentar
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
map + itergetter, eller lambda kan også brukes i denne sammenheng:

 

Syns du knoter det til her :hrm:

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])) :nei:

Bruk enumerate(my_lists).

Endret av snippsat
  • Liker 1
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...