Seite 1 von 2
string umwandeln
Verfasst: Montag 11. Januar 2010, 00:30
von mit
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
Verfasst: Montag 11. Januar 2010, 00:52
von jbs
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')
Verfasst: Montag 11. Januar 2010, 01:04
von mit
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-')
Verfasst: Montag 11. Januar 2010, 01:14
von cofi
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-'
Verfasst: Montag 11. Januar 2010, 01:16
von yipyip
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'
yipyip
Verfasst: Montag 11. Januar 2010, 01:27
von jbs
Hab das a überlesen

Verfasst: Montag 11. Januar 2010, 01:48
von derdon
Code: Alles auswählen
>>> import re
>>> print foo
ABCDEFGT-
>>> pattern = r'[^ACTG-]'
>>> re.sub(pattern, 'a', foo)
'AaCaaaGT-'
Ein klarer Fall für REs

Verfasst: Montag 11. Januar 2010, 01:50
von jbs
Mal eine Frage: wofür brauchst du das?
Verfasst: Montag 11. Januar 2010, 01:51
von derdon
Ich rate mal, dass es was mit Biologie zu tun hat. Aber das sagt gar nix, habs erfolgreich abgewählt

Verfasst: Montag 11. Januar 2010, 01:55
von 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ß
Verfasst: Montag 11. Januar 2010, 08:45
von /me
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 "-"?
Verfasst: Montag 11. Januar 2010, 10:09
von 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.
Verfasst: Montag 11. Januar 2010, 14:07
von mit
Danke für die Lösungen.
@derdon: Du hast recht dieses Beispiel kam aus der Biologie.
Verfasst: Montag 11. Januar 2010, 14:26
von hendrikS
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.
Verfasst: Montag 11. Januar 2010, 15:06
von derdon
/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.
Verfasst: Montag 11. Januar 2010, 21:04
von 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ß
Verfasst: Montag 11. Januar 2010, 21:15
von Hyperion
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...

Verfasst: Montag 11. Januar 2010, 21:19
von problembär
Hyperion hat geschrieben:Was ist denn an BlackJacks Vorschlag so unlesbar?
Nichts, der ist auch völlig ok.
Gruß
Verfasst: Montag 11. Januar 2010, 23:56
von 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.

Verfasst: Dienstag 12. Januar 2010, 01:16
von problembär
Cool, läuft bei mir (nasm, SuSE 10.0)

.
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

.
Gruß