Seite 1 von 1

Ersetzen in List Comprehension

Verfasst: Montag 14. Januar 2013, 17:31
von Nobuddy
Hallo zusammen

Stehe vor der Frage, ob das Ersetzen mit replace bzw. re.sub in einer List Comprehension möglich ist.

Das funktioniert:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

a = (['mein hund ist blau', ' hallo 123'],
    ['meine katze ist rot', 'oklahoma'],
    ['die ampel ist rot', 'oklahoma'])

data = set()
for r in a:
    r[0] = r[0].replace('rot', 'grün')
    data.add(tuple(r))
print(data)
Bisher scheitere ich das Gleiche in einer List Comprehension umzusetzen.

Code: Alles auswählen

data = set([tuple(r) for r in a r[0] = r[0].replace('rot', 'grün')])
Ist das möglich, oder generell nicht?
Wenn es möglich ist, wie bekomme ich dies umgesetzt?

Grüße Nobuddy

Re: Ersetzen in List Comprehension

Verfasst: Montag 14. Januar 2013, 18:07
von Nobuddy
Evtl. bin ich selbst auf eine Lösung gekommen.

Code: Alles auswählen

data = set([tuple(r) for r in a if r[0] == r[0].replace('rot', 'grün')])
print(data)
Kann mir das jemand bestätigen und evtl. noch andere Lösungen posten?

Re: Ersetzen in List Comprehension

Verfasst: Montag 14. Januar 2013, 18:22
von cofi
Ungetestet:

Code: Alles auswählen

data = set((x.replace('rot', 'grün'), y) for x, y in a)
Deine Loesung passt nur, wenn kein "rot" vorkommt, also nichts ersetzt wird.

Re: Ersetzen in List Comprehension

Verfasst: Montag 14. Januar 2013, 18:29
von Sirius3
Nobuddy hat geschrieben:Kann mir das jemand bestätigen und evtl. noch andere Lösungen posten?
Das kannst Du doch selbst beantworten, ob bei beiden Deiner Lösungen das selbe Ergebnis rauskommt.

Re: Ersetzen in List Comprehension

Verfasst: Montag 14. Januar 2013, 18:32
von Nobuddy
Hallo cofi

Hast Recht, meine Lösung funktioniert nicht.

Bei Deiner Lösung, die funktioniert :) habe ich eine Frage.
Gehen wir mal davon aus, Listen mit mehr als nur 2 Spalten zu verwenden, z.B. 10 oder mehr Spalten.

Gibt es dafür auch eine Lösung, oder muß man dann die ganzen Spalten zuerst in der for-Schleife auflisten?

Re: Ersetzen in List Comprehension

Verfasst: Montag 14. Januar 2013, 19:47
von EyDu
Nobuddy hat geschrieben:Gehen wir mal davon aus, Listen mit mehr als nur 2 Spalten zu verwenden, z.B. 10 oder mehr Spalten.

Gibt es dafür auch eine Lösung, oder muß man dann die ganzen Spalten zuerst in der for-Schleife auflisten?
Auch die Frage kannst du dir selber beantworten, wenn du dir die Operationen auf Listen anschaust.

Re: Ersetzen in List Comprehension

Verfasst: Donnerstag 21. Februar 2013, 11:27
von Nobuddy
Hallo zusammen

Hoffe, Ihr könnt mir bei diesem helfen.

Code: Alles auswählen

        line = set([(row, row[hersteller].replace(row[hersteller],
            producerkey.get(row[hersteller])))
            for row in self.List2 if not producer.get(row[hersteller])
            if producerkey.get(row[hersteller])])
self.List2 ist eine TAB-getrennte Liste und besteht aus 31 Spalten.
Ich möchte nun aus dieser Liste, die Spalte row[hersteller] aktualisieren.

Mit obigem Konstrukt, bekomme ich ganz klar nur die Datensätze ausgegeben, die auf die if-Abfrage stimmen.
Weiter wird mit row der unveränderte Datensatz ausgegeben und die Änderung von row[hersteller] daran angefügt.

Wie bekomme ich es in der LC hin, daß alle Daten der Liste ausgegeben werden und die betreffenden Daten in row[hersteller] verändert werden?

Grüße Nobuddy

Re: Ersetzen in List Comprehension

Verfasst: Donnerstag 21. Februar 2013, 12:43
von BlackJack
@Nobuddy: Wenn ich Dich richtig verstanden habe willst Du etwas tun wofür LCs nicht da sind. Mit einer LC erstellt man eine neue Liste. Das ist kein Ersatz für eine ``for``-Schleife in der man bestehende Daten verändern möchte.

Re: Ersetzen in List Comprehension

Verfasst: Donnerstag 21. Februar 2013, 13:02
von Nobuddy
Hallo BlackJack

Danke für Deine Info, dann weiß ich, wie ich weiter vorgehe. :wink: