Doppelte Listeneinträge -> Zählen und reduzieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

Freitag 4. April 2008, 18:33

Hi!

Ich habe eine Liste aus Listen mit doppelten Einträgen, die ich zum einen Zählen, zum anderen auf nicht redundantes reduzieren möchte.
Die Anzahl der doppelten Eintraege will ich hinten anhaengen.

Code: Alles auswählen

list_2_write_matched_points=
[[-1.391, 32.32, 28.800000000000001, 12.42],
[-1.391, 32.32, 28.800000000000001, 12.42],
[-1.391, 32.32, 28.800000000000001, 12.42],
[-1.391, 32.32, 28.800000000000001, 12.42],
[-0.031, 41.32, 30.300000000000001, 13.92],
[-0.031, 41.32, 30.300000000000001, 13.92]]


for i in list_2_write_matched_points:			
	counter =0 
		
	for j in list_2_write_matched_points:
		if i ==j:
			counter +=1			
	
	i.append(counter)
			
			
for k in list_2_write_matched_points:
	 if(k[0:5]) not in reduced_list:
		reduced_list.append(k[0:5])
					 		
for element in reduced_list:
	print element			

Leider wird Counter um die vorh. Anzahl d. doppelten Einträge mehrfach angehängt --- ich finde die Lösung auch nicht gerade elegant.

Wäre Klasse, wenn jemand eine performantere Lösung parat hätte.

Danke!
BlackJack

Freitag 4. April 2008, 18:55

Ist ein Fall für `itertools.groupby()`:

Code: Alles auswählen

from itertools import groupby
from pprint import pprint


def ilen(iterable):
    return sum(1 for dummy in iterable)


def main():
    list_2_write_matched_points = [[-1.391, 32.32, 28.800000000000001, 12.42],
                                   [-1.391, 32.32, 28.800000000000001, 12.42],
                                   [-1.391, 32.32, 28.800000000000001, 12.42],
                                   [-1.391, 32.32, 28.800000000000001, 12.42],
                                   [-0.031, 41.32, 30.300000000000001, 13.92],
                                   [-0.031, 41.32, 30.300000000000001, 13.92]]

    reduced = [key + [ilen(items)]
               for key, items in groupby(list_2_write_matched_points)]
    
    pprint(reduced)
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

Samstag 5. April 2008, 13:59

Starke Sache!
Vielen Dank für die schnelle Hilfe!
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Samstag 5. April 2008, 14:01

Zum reinen Entfernen von Duplikaten aus einer Liste wird diese gerne mittels `list(set(foo))` übergangsweise in ein Set (eine Menge, und Mengen enthalten keine Duplikate) umgewandelt.
Antworten