2012-05-30 34 views
6

Sự cố: chia chuỗi thành danh sách các từ theo ký tự dấu tách được chuyển vào dưới dạng danh sách.vấn đề tách chuỗi

String: "After the flood ... all the colors came out."

đầu ra mong muốn: ['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']

Tôi đã viết hàm sau - lưu ý Tôi biết rằng có những cách tốt hơn để chia một chuỗi sử dụng một số trăn được xây dựng trong các chức năng nhưng vì lợi ích của học tôi nghĩ tôi sẽ tiến hành theo cách này:

def split_string(source,splitlist): 
    result = [] 
    for e in source: 
      if e in splitlist: 
       end = source.find(e) 
       result.append(source[0:end]) 
       tmp = source[end+1:] 
       for f in tmp: 
        if f not in splitlist: 
         start = tmp.find(f) 
         break 
       source = tmp[start:] 
    return result 

out = split_string("After the flood ... all the colors came out.", " .") 

print out 

['After', 'the', 'flood', 'all', 'the', 'colors', 'came out', '', '', '', '', '', '', '', '', ''] 

tôi không thể tìm ra lý do tại sao "bước ra" không được chia thành "đến" và "ra" như hai từ riêng biệt. Nó giống như thể nhân vật khoảng trống giữa hai từ đang bị bỏ qua. Tôi nghĩ phần còn lại của đầu ra là rác xuất phát từ vấn đề liên quan đến vấn đề "xuất hiện".

EDIT:

Tôi đi theo @ IVC đề nghị và đã đưa ra đoạn mã sau:

def split_string(source,splitlist): 
    result = [] 
    lasti = -1 
    for i, e in enumerate(source): 
     if e in splitlist: 
      tmp = source[lasti+1:i] 
      if tmp not in splitlist: 
       result.append(tmp) 
      lasti = i 
     if e not in splitlist and i == len(source) - 1: 
      tmp = source[lasti+1:i+1] 
      result.append(tmp) 
    return result 

out = split_string("This is a test-of the,string separation-code!"," ,!-") 
print out 
#>>> ['This', 'is', 'a', 'test', 'of', 'the', 'string', 'separation', 'code'] 

out = split_string("After the flood ... all the colors came out.", " .") 
print out 
#>>> ['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out'] 

out = split_string("First Name,Last Name,Street Address,City,State,Zip Code",",") 
print out 
#>>>['First Name', 'Last Name', 'Street Address', 'City', 'State', 'Zip Code'] 

out = split_string(" After the flood ... all the colors came out...............", " ." 
print out 
#>>>['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out'] 

Trả lời

2

Bạn dường như được mong đợi:

source = tmp[start:] 

Để chỉnh sửa source rằng bên ngoài vòng lặp for được lặp kết thúc. Nó sẽ không - vòng lặp đó sẽ tiếp tục đi qua chuỗi bạn đã cho nó, không phải bất kỳ đối tượng đang sử dụng tên đó. Điều này có thể có nghĩa là nhân vật bạn đang làm không thể ở bên trái của source.

Thay vì cố gắng để làm điều đó, theo dõi các chỉ số hiện tại trong chuỗi theo cách này:

for i, e in enumerate(source): 
    ... 

và những gì bạn đang phụ thêm sẽ luôn luôn được source[lasti+1:i], và bạn chỉ cần theo dõi lasti .

+1

Cảm ơn tất cả vì những giải pháp tuyệt vời. Tôi đã đi với điều này bởi vì nó buộc tôi phải học logic thay vì sử dụng các hàm dựng sẵn. Rõ ràng, nếu tôi viết mã thương mại, tôi sẽ không tái phát minh ra bánh xe nhưng vì mục đích học tập, tôi sẽ đi với câu trả lời này. Cảm ơn mọi sự giúp đỡ của bạn. – codingknob

3

Bạn không cần vòng lặp gọi bên trong. Chỉ cần điều này là đủ:

def split_string(source,splitlist): 
    result = [] 
    for e in source: 
      if e in splitlist: 
       end = source.find(e) 
       result.append(source[0:end]) 
       source = source[end+1:] 
    return result 

Bạn có thể loại bỏ các "rác" (có nghĩa là, chuỗi rỗng), bằng cách kiểm tra nếu nguồn [: cuối] là một chuỗi rỗng hay không trước khi bạn thêm nó vào danh sách.

0

Tại sao phải làm quá nhiều thứ, Chỉ cần đơn giản này, hãy thử ..
str.split(strSplitter , intMaxSplitCount)intMaxSplitCount là không bắt buộc
Trong trường hợp của bạn, bạn gotta làm một số houskeeping quá, nếu bạn muốn tránh ... một là bạn có thể thay thế nó, như str.replace(".","", 3)3 là tùy chọn, nó sẽ thay thế 3 dấu chấm đầu tiên chỉ

như vậy trong ngắn bạn phải làm sau,
print ((str.replace(".", "",3)).split(" ")) nó sẽ in những gì bạn mong muốn

tôi đã thực hiện, Just Check Here,...

0
[x for x in a.replace('.', '').split(' ') if len(x)>0] 

đây 'a' là chuỗi đầu vào của bạn.

0

Một cách đơn giản hơn, ít nhất là trông đơn giản hơn ..

import string 

    def split_string(source, splitlist): 
     table = string.maketrans(splitlist, ' ' * len(splitlist)) 
     return string.translate(source, table).split() 

Bạn có thể kiểm string.maketransstring.translate

2

Tôi nghĩ rằng nếu bạn sử dụng regex bạn có thể nhận được nó một cách dễ dàng nếu bạn muốn chỉ các từ trong chuỗi được đưa ra ở trên.

>>> import re 
>>> string="After the flood ... all the colors came out." 
>>> re.findall('\w+',string) 
['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']