2012-10-12 63 views

Trả lời

100

Sẽ này làm việc cho tình huống của bạn?

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

Điều này làm cho việc sử dụng một hiểu danh sách, và những gì đang xảy ra ở đây cũng tương tự như cấu trúc này:

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) 

Như @AshwiniChaudhary và @KirkStrauser chỉ ra, bạn thực sự không cần phải sử dụng dấu ngoặc đơn trong một lớp lót, làm cho các mảnh bên trong dấu ngoặc đơn một biểu thức máy phát điện (hiệu quả hơn so với một danh sách hiểu). Thậm chí nếu điều này không phù hợp với những yêu cầu về nhiệm vụ của bạn, nó là một cái gì đó bạn nên đọc về cuối cùng :):

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

học một chuỗi mới chức năng ngày hôm nay, cảm ơn rocketdonkey! –

+0

@SeanJohnson Tuyệt vời! Tôi chắc chắn rằng tôi đã học được rằng từ một người khác trên trang web này, vì vậy chu trình hoàn tất :) – RocketDonkey

+0

@RocketDonkey không cần '[]' –

2

Tôi rất muốn sử dụng regex để thực hiện điều này, nhưng vì bạn chỉ có thể sử dụng danh sách, vòng, chức năng, vv ..

đây là những gì tôi đã đưa ra:

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

Nếu tôi hiểu câu hỏi của bạn đúng, có một cách để làm là phá vỡ các chuỗi trong chars và sau đó kiểm tra từng chuỗi trong chuỗi đó bằng cách sử dụng vòng lặp cho dù đó là chuỗi hoặc số và sau đó nếu chuỗi lưu trong biến và sau đó khi vòng kết thúc xong, hãy hiển thị cho người dùng

+0

Một vòng lặp tự động lặp qua tất cả các ký tự của một chuỗi, do đó không cần phải bẻ chuỗi thành ký tự. –

3

Điều gì về điều này:

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

Nói st là chuỗi chưa định dạng của bạn, sau đó chạy

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

như đã đề cập ở trên. Nhưng tôi đoán rằng bạn cần một cái gì đó rất đơn giản nên nói s là chuỗi của bạn và st_res là một chuỗi mà không cần chữ số, thì đây là mã của bạn

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

Không chắc chắn nếu giáo viên của bạn cho phép bạn sử dụng bộ lọc nhưng ...

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

returns-

'aaasdffgh' 

Hiệu quả hơn nhiều so với lặp vòng ...

Ví dụ:

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

Chỉ cần một vài (những người khác đã gợi ý một số trong những)

Phương pháp 1:

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

Cách 2:

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

Phương pháp 3:

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

Phương pháp 4:

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

Phương pháp 5:

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

Nó sẽ là đáng giá để hiển thị so sánh hiệu quả về những điều này. –

65

Và, chỉ để ném nó trong hỗn hợp, là oft-quên str.translate mà sẽ làm việc nhanh hơn nhiều so với biểu thức lặp/cụm từ thông dụng:

Đối với Python 2:

from string import digits 

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

Đối với Python 3:

from string import digits 

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

Thật tuyệt vời! Tôi không biết điều đó. – JayJay123

+9

Cách tiếp cận này sẽ không hoạt động trong Python3. Thay vào đó, hãy thực hiện: ''abc123def456ghi789zero0'.translate ({ord (k): Không cho chữ số k})' – valignatev

+2

Giải pháp tốt nhất cho Python2. –