Ersetzen in List Comprehension

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
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

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
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

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
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.
Nobuddy
User
Beiträge: 996
Registriert: Montag 30. Januar 2012, 16:38

Hallo BlackJack

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