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
string umwandeln
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]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
- 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-'
Code: Alles auswählen
>>> import string
>>> b = string.maketrans("BDEF","aaaa")
>>> a = "ABCDEFGT-"
>>> a.translate(b)
'AaCaaaGT-'
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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
Code: Alles auswählen
>>> import re
>>> print foo
ABCDEFGT-
>>> pattern = r'[^ACTG-]'
>>> re.sub(pattern, 'a', foo)
'AaCaaaGT-'

Ich würd's so machen:
Gruß
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.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
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 "-"?
@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.
Ich würde die `str.translate()`-Methode verwenden, mit einer Tabelle, die einmal pro Programmlauf erstellt wird.
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.mit hat geschrieben:Danke für die Lösungen.
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./me hat geschrieben:Mir gefällt die re-Variante am besten.
Hab' auch das 'a' überlesen/me hat geschrieben:Das kann man so machen, allerdings entspricht das nicht der Aufgabenstellung.

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
Mit dem Einwand hab' ich gerechnetBlackjack 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…

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;
}
Zuletzt geändert von problembär am Montag 11. Januar 2010, 21:22, insgesamt 2-mal geändert.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Was ist denn an BlackJacks Vorschlag so unlesbar?problembär hat geschrieben:Mit dem Einwand hab' ich gerechnetBlackjack 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…. So würd' ich's machen, wenn's einfach und gut lesbar sein soll.
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-'
Wobei Du auch dann noch quadratische Laufzeit hast...problembär hat geschrieben: Wenn's schnell sein soll, würd ich's so machen:
<C-Code>

Nichts, der ist auch völlig ok.Hyperion hat geschrieben:Was ist denn an BlackJacks Vorschlag so unlesbar?
Gruß
@problembär: Na also wenn dann schon so (ungetestet, NASM-Syntax):
Adresse der Zeichenkette wird auf dem Stack erwartet. 
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

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ß

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ß