FraXinuS Skrevet 6. april 2006 Del Skrevet 6. april 2006 Jeg har en liste med lister som ser f.eks slik ut: [[1,2,5], [2, 5, 7], [3, 5,], [3, 7, 8, 9], [3, 5], [4, 6], [3, 6, 7], [3, 6], [4, 7]] Det jeg prøver på er å søke gjennom lista etter en liste som har kun 2 tall i seg. Hvis den finner det så søker den gjennom lista for å se om det er en annen liste som er helt lik. hvis den finner det så skal tallene fra de to listene fjernes fra de andre. Så med list over så skal det ende opp slik: [[1,2], [2, 7], [3, 5,], [7, 8, 9], [3, 5], [4, 6], [6, 7], [6], [4, 7]] Der var det to lister som hadde bare 3 og 5 i seg. Da fjernes 3 og 5 fra alle de andre listene. Jeg endte opp med dette da jeg prøvde, men det funker ikke. Jeg mista litt oversikte da jeg holdt på så det ble litt rotete. Ikke si svaret hvis dere vet hvordan det gjøres. Bare si om jeg er helt på jordet med det jeg lagde under her. Eller gi noen hint om hvordan det kan gjøres. i = 0 while i < 8: if len(self.vl[i]) == 2: for li in self.vl: if self.vl[i] == li: for li2 in self.vl: if len(li2) > 2: if self.vl[i][0] in li2: li2.remove(self.vl[i][0] elif self.vl[i][1] in li2: li2.remove(self.vl[i][1] i = i + 1 Lenke til kommentar
Gjest Slettet-8fx0y6VV Skrevet 6. april 2006 Del Skrevet 6. april 2006 (endret) Denne koden gjor jobben, dog kommer ikke rekkene ut igjenn i samme rekkefolge som de kom inn. def remove_pairs_from_all_others(li): # count the number of times each identical list appares tmp_dict = {} for item in li: if tmp_dict.has_key( str(item) ): tmp_dict[ str(item) ][0] += 1 else: tmp_dict[ str(item) ] = [1, item] # add the list that appared once to the new_list and add the ones with # two or more identical lists to a temporary list with all the numbers # that is going to be removed from the new_list new_list = [] to_be_removed = [] safe_lists = [] for value in tmp_dict.itervalues(): # we want to add the numbers to the to_be_rmeoved list, and we also want # the list to be added to the safe_list if value[0] > 1: to_be_removed.extend([x for x in value[1] if x not in to_be_removed]) safe_lists.append(value[1]) # add each item to the new_list n = value[0] while n > 0: new_list.append(value[1]) n -= 1 # remove the items in to_be_removed from the new_list t1 = [] for list in new_list: if list in safe_lists: # skip it t1.append(list) else: # remove the to_be_removed numbers from it t1.append([num for num in list if num not in to_be_removed]) new_list = t1 return new_list Endret 6. april 2006 av rapt0r Lenke til kommentar
FraXinuS Skrevet 6. april 2006 Forfatter Del Skrevet 6. april 2006 Da funker det ikke, for rekkefølgen må være den samme, hvis ikke blir alt ødelagt. Lenke til kommentar
zeitgeist Skrevet 6. april 2006 Del Skrevet 6. april 2006 (endret) Morsom sak. Jeg løste det som vist under. Ikke spesielt elegant og ikke effektivt hvis lista er svært stor, men det ser ut til å funke. Jeg tror kanskje en itertools-modulen er tingen for dette hvis effektivitet er kritisk. Håper det er begripelig ;-) Hvis du lurer på hvorfor jeg bruker tuple() i filter_lists() og list(match) i remove_in_lists, så skyldes det brukes av set(). Set() er en grei måte å fjerne duplikater i en liste på, men krever at det som skal fjernes er hashable. Lister er ikke det, fordi de er mutable., men tupler gjør det, fordi de er immutable. def filter_lists(lists): # collect lists with two items matches = [lst for lst in lists if len(lst) == 2] # isolate matches that occur more than once true_matches = [tuple(lst) for lst in matches if matches.count(lst) > 1] # if any true_matches, match from list, else return list # (use set(tuple()) to remove duplicates) if true_matches: return remove_in_lists(lists, set(tuple(true_matches))) return lists def remove_in_lists(lists, true_matches): filtered_lists = [] # loop through all lists, remove numbers # from all lists except the matches themselves for lst in lists: for match in true_matches: if lst != list(match): for num in match: if num in lst: lst.remove(num) filtered_lists.append(lst) return filtered_lists lists = [[1,2,5], [2, 5, 7], [3, 5,], [3, 7, 8, 9], [3, 5], [4, 6], [3, 6, 7], [3, 6], [4, 7]] filtered_lists = filter_lists(lists) Endret 6. april 2006 av zeitgeist Lenke til kommentar
FraXinuS Skrevet 6. april 2006 Forfatter Del Skrevet 6. april 2006 Nice, den funket bra den der! Må bare prøve å forstå den først, så skal jeg se om jeg får den til å funker i den saken jeg holder på å lage. Lenke til kommentar
zeitgeist Skrevet 7. april 2006 Del Skrevet 7. april 2006 Nice, den funket bra den der! Må bare prøve å forstå den først, så skal jeg se om jeg får den til å funker i den saken jeg holder på å lage. 5881122[/snapback] Koden er ganske rett fram. Men mange syns list comprehensions (listcomps) er vanskelig å lese. Det er kanskje lettere hvis det brytes opp litt: # dict med navn : alder names = {'arnold' : 18, 'birger' : 18, 'johanne' : 18, 'arnhild' : 17, 'roy-august' : 17, 'olga' : 18} # festbremser dull_persons = ['birger', 'johanne'] #listcomp ... party_personell = [x.capitalize() for x, y in names.items() if y > 17 if x not in dull_persons] # ... som tilsvarer denne for-konstruksjonen: party_personell = [] for name, age in names.items(): if age > 17: if name not in dull_persons: party_personell.append(name.capitalize()) list comprehensions bør leses på samme måten som for-løkka: party_personell = [x.capitalize() for x, y in names.items() if y > 17 if x not in dull_persons] i samme rekkefølge som i løkka: 1. blå 2. rød 3. lilla 4. grønn Og i 4 kan man lese party_personell.append(x.capitalize()), for det er jo det som skjer. Lenke til kommentar
FraXinuS Skrevet 7. april 2006 Forfatter Del Skrevet 7. april 2006 Ja, jeg synes det er mye lettere å lese vanlige for looper, men det er nok fordi jeg aldri har brukt sånne list comprehensions før. Men blir sikkert vant til det etterhvert hvis jeg begynner å bruke dem litt. 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å