Gå til innhold

Anbefalte innlegg

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
Videoannonse
Annonse
Gjest Slettet-8fx0y6VV

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

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 av zeitgeist
Lenke til kommentar
Nice, den funket bra den der! :thumbup:

 

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

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...