2012-10-12 12 views

Odpowiedz

100

byłoby to pracować dla twojej sytuacji?

>>> s = '12abcd405' 
>>> result = ''.join([i for i in s if not i.isdigit()]) 
>>> result 
'abcd' 

To sprawia, że ​​korzystanie z listowego, a co się tutaj dzieje, jest podobna do tej struktury:

no_digits = [] 
# Iterate through the string, adding non-numbers to the no_digits list 
for i in s: 
    if not i.isdigit(): 
     no_digits.append(i) 

# Now join all elements of the list with '', 
# which puts all of the characters together. 
result = ''.join(no_digits) 

Jak @AshwiniChaudhary i @KirkStrauser podkreślić, faktycznie nie trzeba używać nawiasy w jedno-liniowej, czyniąc kawałek wewnątrz nawiasów wyrażeniem generatora (bardziej wydajnym niż zrozumienie listy). Nawet jeśli to nie pasuje wymagania dla Twojego zadania, to jest coś należy przeczytać o końcu :):

>>> s = '12abcd405' 
>>> result = ''.join(i for i in s if not i.isdigit()) 
>>> result 
'abcd' 
+0

nauczył się nowy łańcuch Funkcjonuj już dziś, dzięki rocketdonkey! –

+0

@SeanJohnson Awesome! Jestem pewien, że dowiedziałem się o tym od kogoś innego na tej stronie, więc cykl jest kompletny :) – RocketDonkey

+0

@RocketDonkey nie ma potrzeby "[]' –

2

Chciałbym użyć wyrażenia regularnego do osiągnięcia tego celu, ale skoro można użyć tylko list, pętle, funkcje itp ..

oto co wymyśliłem:

stringWithNumbers="I have 10 bananas for my 5 monkeys!" 
stringWithoutNumbers=''.join(c if c not in map(str,range(0,10)) else "" for c in stringWithNumbers) 
print(stringWithoutNumbers) #I have bananas for my monkeys! 
1

Jeśli rozumiem pytanie rację, jeden sposób, aby zrobić to przełamać ciąg w znaki i następnie sprawdzić każdy char w tego łańcucha za pomocą pętli, czy jest to ciąg znaków lub numer, a następnie, jeśli ciąg zapisać go w zmiennej, a następnie po zakończeniu pętli, wyświetla, że ​​użytkownikowi

+0

For-loop automatycznie iteruje każdy ciąg znaków, więc nie ma potrzeby dzielenia łańcucha na znaki. –

3

Co o tym:

out_string = filter(lambda c: not c.isdigit(), in_string) 
2

Powiedz, że to twój niesformatowany ciąg znaków, a następnie uruchom

st_nodigits=''.join(i for i in st if i.isalpha()) 

jak wspomniano powyżej. Ale zgaduję, że trzeba coś bardzo prostego więc powiedzieć s jest ciąg i st_res jest ciągiem bez cyfr, to tutaj jest kod

l = ['0','1','2','3','4','5','6','7','8','9'] 
st_res="" 
for ch in s: 
if ch not in l: 
    st_res+=ch 
12

Nie jestem pewien, czy nauczyciel pozwala na stosowanie filtrów ale ...

filter(lambda x: x.isalpha(), "a1a2a3s3d4f5fg6h") 

returns-

'aaasdffgh' 

O wiele skuteczniejsza niż zapętlanie ...

Przykład:

for i in range(10): 
    a.replace(str(i),'') 
2

Zaledwie kilka (inni sugerowali niektórzy z nich)

Metoda 1:

''.join(i for i in myStr if not i.isdigit()) 

Metoda 2:

def removeDigits(s): 
    answer = [] 
    for char in s: 
     if not char.isdigit(): 
      answer.append(char) 
    return ''.join(char) 

Metoda 3:

''.join(filter(lambda x: not x.isdigit(), mystr)) 

Metoda 4:

nums = set(map(int, range(10))) 
''.join(i for i in mystr if i not in nums) 

Metoda 5:

''.join(i for i in mystr if ord(i) not in range(48, 58)) 
+1

Warto byłoby pokazać na nich porównanie wydajności. –

65

I, po prostu wyrzucić go w miksie, jest często zapomniane str.translate która będzie działać o wiele szybciej niż w przypadku zapętleń/wyrażeń regularnych:

Dla Python 2:

from string import digits 

s = 'abc123def456ghi789zero0' 
res = s.translate(None, digits) 
# 'abcdefghizero' 

Pythona 3:

from string import digits 

s = 'abc123def456ghi789zero0' 
remove_digits = str.maketrans('', '', digits) 
res = s.translate(remove_digits) 
# 'abcdefghizero' 
+2

Po prostu niesamowite! Nie wiedziałem tego. – JayJay123

+9

To podejście nie działa w języku Python3. Zamiast tego: ''abc123def456ghi789zero0'.translate ({ord (k): Brak dla k w cyfrach})' – valignatev

+2

Najlepsze rozwiązanie dla Python2. –