string umwandeln

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.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Hallo,
Ich habe ein String welcher A bis Z und - enthaelt z.B. A, B, C, D, G, T, -, Z .

Wie kann ich alle Buchstaben und "-" ausser A, C, G, T in klein a umwandeln?

Viele Gruesse
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

def lower(s, without=''):
    return ''.join(c.lower() if c not in without else c for c in s)

print lower('ABCDEFG', 'CDE')
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke, aber mit diesem Skript bekomme ich AbCdefGT- aber wie kann ich AaCaaaGT- erhalten?

def lower(s, without=''):
return ''.join(c.lower() if c not in without else c for c in s)

print lower('ABCDEFGT-', 'ACGT-')
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

>>> def lower(s, without=''):
...     return ''.join("a" if c not in without else c for c in s)
... 
>>> lower('ABCDEFGT-', 'ACGT-')
'AaCaaaGT-'
Alternativ:

Code: Alles auswählen

>>> import string
>>> b = string.maketrans("BDEF","aaaa")
>>> a = "ABCDEFGT-"
>>> a.translate(b)
'AaCaaaGT-'
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Code: Alles auswählen

In [10]: transform = lambda s: ''.join(x if x  in 'ACTG' else 'a' for x in s)

In [11]: transform('AGSKYSASJKASIOJASJK----ACTG')
Out[11]: 'AGaaaaAaaaAaaaaAaaaaaaaACTG'
:wink:
yipyip
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Hab das a überlesen :(
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

>>> import re
>>> print foo
ABCDEFGT-
>>> pattern = r'[^ACTG-]'
>>> re.sub(pattern, 'a', foo)
'AaCaaaGT-'
Ein klarer Fall für REs :twisted:
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Mal eine Frage: wofür brauchst du das?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ich rate mal, dass es was mit Biologie zu tun hat. Aber das sagt gar nix, habs erfolgreich abgewählt ;)
problembär

Ich würd's so machen:

Code: Alles auswählen

a = "ABCDGT-Z"
b = "ACGT"

c = ""
for i in a:
    if i in b:
        c += i
    else:
        c += i.lower()
print c
Gruß
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

problembär hat geschrieben:Ich würd's so machen:

Code: Alles auswählen

a = "ABCDGT-Z"
b = "ACGT"

c = ""
for i in a:
    if i in b:
        c += i
    else:
        c += i.lower()
print c
Das kann man so machen, allerdings entspricht das nicht der Aufgabenstellung.

Mir gefällt die re-Variante am besten. Mich irritiert allerdings noch ein Teil der Fragestellung. Im ersten Posting heißt es, es sollten alle Buchstaben und "-" ausser A, C, G, T in ein kleines "a" umgewandelt werden. In einem späteren Posting möchte der Fragesteller dann aber aus 'ABCDEFGT-' den String 'AaCaaaGT-' erhalten. Wie ist das nun mit dem "-"?
BlackJack

@problembär: Damit hältst Du bis jetzt wohl den ersten Platz für die schlechteste Laufzeit. In quadratischer Laufzeit eine Zeichenkette aufbauen und die lineare Suche in einer Zeichenkette…

Ich würde die `str.translate()`-Methode verwenden, mit einer Tabelle, die einmal pro Programmlauf erstellt wird.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke für die Lösungen.

@derdon: Du hast recht dieses Beispiel kam aus der Biologie.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

mit hat geschrieben:Danke für die Lösungen.
Wäre dennoch vielleicht interessant, welchen der Vorschläge Du nutzen wirst. Also finde ja auch, dass man das mit str.translate machen sollte. Dafür muss man nichts hausgemachtes schreiben.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

/me hat geschrieben:Mir gefällt die re-Variante am besten.
Mein re-Beispiel sollte eher ironisch verstanden werden. Ich wollte damit zeigen, dass reguläre Ausdrücke häufig unnötigerweise eingesetzt werden. Ich finde wie BlackJack die translate-Methode am elegantesten.
problembär

/me hat geschrieben:Das kann man so machen, allerdings entspricht das nicht der Aufgabenstellung.
Hab' auch das 'a' überlesen :(. Dann also

Code: Alles auswählen

a = "ABCDGT-Z"
b = "ACGT"

c = ""
for i in a:
    if i in b:
        c += i
    else:
        c += "a"
print c
Blackjack hat geschrieben:@problembär: Damit hältst Du bis jetzt wohl den ersten Platz für die schlechteste Laufzeit. In quadratischer Laufzeit eine Zeichenkette aufbauen und die lineare Suche in einer Zeichenkette…
Mit dem Einwand hab' ich gerechnet :). So würd' ich's machen, wenn's einfach und gut lesbar sein soll. Wenn's schnell sein soll, würd ich's so machen:

Code: Alles auswählen

#include <stdio.h>
#include <string.h>

/* transform.c: Compile with:

   gcc -Wall -Wextra -ansi -pedantic -O3 transform.c -o transform
*/

int main(void)
{
    int i, u, x;
    char a[] = "AGSKYSASJKASIOJASJK----ACTG";
    char b[] = "ACGT";

    int alen = strlen(a);
    int blen = strlen(b);

    puts(a);

    for (i = 0; i < alen; i++) {
        x = 0;
        for (u = 0; u < blen; u++) {
            if(b[u] == a[i]) {
                x = 1;
                break;
            }
        }
        if (!x) {
            a[i] = 'a';
        }
    }
    puts(a);
    return 0;
}
Gruß
Zuletzt geändert von problembär am Montag 11. Januar 2010, 21:22, insgesamt 2-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

problembär hat geschrieben:
Blackjack hat geschrieben:@problembär: Damit hältst Du bis jetzt wohl den ersten Platz für die schlechteste Laufzeit. In quadratischer Laufzeit eine Zeichenkette aufbauen und die lineare Suche in einer Zeichenkette…
Mit dem Einwand hab' ich gerechnet :). So würd' ich's machen, wenn's einfach und gut lesbar sein soll.
Was ist denn an BlackJacks Vorschlag so unlesbar?

Code: Alles auswählen

In [14]: from string import maketrans

In [15]: text = "ABCDEFGT-"

In [16]: table = maketrans("BDEF", "aaaa")

In [17]: text.translate(table)
Out[17]: 'AaCaaaGT-'
(ok, das "maketrans" müßte man natürlich noch erweitern...)
problembär hat geschrieben: Wenn's schnell sein soll, würd ich's so machen:
<C-Code>
Wobei Du auch dann noch quadratische Laufzeit hast... :roll:
problembär

Hyperion hat geschrieben:Was ist denn an BlackJacks Vorschlag so unlesbar?
Nichts, der ist auch völlig ok.

Gruß
BlackJack

@problembär: Na also wenn dann schon so (ungetestet, NASM-Syntax):

Code: Alles auswählen

global _transform

section .data
table:	db 0, 0, 0, 0 	; ... 256 0/1-values wether the corresponding character
			; code should be replaced by an 'a' or not.

section .text
_transform:
	xor	eax, eax
	pop	ebx
loop0:
	mov	al, [ebx]
	cmp	al, 0
	je	return
	
	cmp	byte [eax+table], 0
	jne	skip
	mov	byte [ebx], 'a'
skip:
	inc	ebx
	jmp	loop0
return:
	ret
Adresse der Zeichenkette wird auf dem Stack erwartet. :-)
problembär

Cool, läuft bei mir (nasm, SuSE 10.0) :D.
Obwohl ich (wie immer bei Assembler) nur Bahnhof verstehe ...

Zu Deinem Python-Vorschlag fand ich übrigens noch interessant, daß viele auch bei so einfacher Datenverarbeitung in Python recht bald mit Modulen arbeiten. Spricht ja nichts dagegen, überrascht mich nur etwas :D.

Gruß
Antworten