2012-04-02 20 views
6

Tôi đang tìm một thuật toán sẽ lấy một vectơ của các chuỗi v1 và trả lại một vectơ tương tự của chuỗi v2 trong đó mỗi chuỗi nhỏ hơn x ký tự và độc đáo. Các chuỗi trong v1 có thể không phải là duy nhất.Làm cách nào tôi có thể rút ngắn một danh sách các chuỗi sao cho chúng dài tối đa x ký tự

Trong khi tôi cần chấp nhận ASCII ở v1, tôi chỉ muốn chèn các ký tự chữ và số ([A-Za-z0-9]) khi cần nhập ký tự mới.

Rõ ràng có ba hãy cẩn thận ở đây:

  1. Đối với một số giá trị của v1x, không có khả năng độc đáo v2. Ví dụ: khi v1 có 37 thành phần và x == 1.

  2. "Tương tự" như được chỉ định trong câu hỏi là chủ quan. Các chuỗi sẽ được người dùng đối mặt và có lẽ là các cụm từ ngôn ngữ tự nhiên ngắn (ví dụ: "số lượng màu"). Tôi muốn một con người có thể ánh xạ bản gốc đến chuỗi rút gọn dễ dàng nhất có thể. Điều này có thể có nghĩa là tận dụng lợi thế của heuristics như disemvoweling. Bởi vì có lẽ không có thước đo khách quan nào về cấu trúc tương tự của tôi (khoảng cách chuỗi có lẽ sẽ không hữu ích nhất ở đây, mặc dù nó có thể) phán xét của tôi về những gì tốt sẽ là tùy ý. Phương pháp này phải phù hợp với tiếng Anh - các ngôn ngữ khác không liên quan.

Rõ ràng đây là vấn đề bất khả tri về ngôn ngữ (lập trình), nhưng tôi sẽ ưu tiên thực hiện trong python (vì tôi tìm ngôn ngữ xử lý chuỗi thẳng về phía trước).

+1

Ý của bạn là gì? 'Tôi chỉ muốn chèn ký tự chữ và số ([A-Za-z0-9]) khi chèn ký tự mới.' – jamylak

+4

Điều này nghe giống như một vấn đề thú vị, nhưng tôi đang đấu tranh để xem chính xác những gì bạn đang yêu cầu. Bạn có nghĩ rằng bạn có thể cung cấp một ví dụ rất đơn giản về đầu vào và đầu ra mong muốn không? –

+0

Ngoài ra, mức độ "rút ngắn" chúng ta đang nói đến là gì? Số lượng màu sắc -> nmbr của clrs, hoặc số lượng màu sắc -> n o c? –

Trả lời

-1
def split_len(seq, length): 
    return [seq[i:i+length] for i in range(0, len(seq), length)] 
newListOfString=[] 
for item in listOfStrings: 
    newListOfString.append(split_len(item,8)[0]) 

trả về 8 ký tự đầu tiên.

+2

Tôi khá chắc chắn rằng OP có thể tự mình hình dung ra điều này. Ngoài ra '[_ [: 8] cho _ trong listOfStrings]' sẽ làm tương tự. – Kimvais

1

một vài ghi chú/con trỏ về việc này trong python.

  1. để giữ mảng kết quả của bạn nhằm dễ dàng phát hiện ra những tiềm năng không độc đáo. Điều này hữu ích ngay cả khi v1 đã được sắp xếp (ví dụ: nameenemy sẽ va chạm sau khi ngắt kết nối)
  2. Có thể thực hiện khám phá bằng cách gọi đơn giản .translate(None, "aeiouyAEIOUY") trên chuỗi.
  3. Trong trường hợp trùng lặp, bạn có thể cố gắng giải quyết va chạm trước bằng cách giảm tất cả kết quả và sử dụng swapcase làm "bitmask", tức là nhiều lần xuất hiện aaa trở thành ["aaa", "aaA", "aAa", "aAA"] v.v. và nếu không đủ ký tự "bắt đầu" từ đầu , cho đến khi tìm thấy số nhận dạng không va chạm, ví dụ: ["aa"]*7 sẽ trở thành ["aa", "aA", "Aa", "AA", "ab", "aB", "Ab"]
1

Sketch -

Xây dựng một danh sách các chức năng làm giảm kích thước của một chuỗi tiếng anh. Đặt hàng các hàm từ ít nhất đến tối nghĩa nhất.

Đối với mỗi chuỗi trong v1 liên tục áp dụng chức năng che khuất cho đến khi nó không còn có thể giảm kích thước của chuỗi và sau đó chuyển sang hàm tiếp theo.

Khi kích thước mong muốn x đạt được, hãy xác minh chuỗi bị giảm là duy nhất đối với các chuỗi đã có trong v2. Nếu vậy, hãy thêm nó vào v2, nếu không, tiếp tục áp dụng các chức năng che khuất.

Sau đây là một số ý tưởng cho các chức năng giảm kích thước được chủ động đặt hàng từ ít nhất đến tối nghĩa nhất. (The lựa chọn ngẫu nhiên nhằm tăng khả năng chuỗi giảm là duy nhất.)

  1. Thay thế một sự xuất hiện ngẫu nhiên của hai không gian nhân vật màu trắng với một không gian đơn
  2. Thay thế một sự xuất hiện ngẫu nhiên của dấu chấm câu tiếp theo không gian với một không gian đơn
  3. Xóa ngẫu nhiên một ký tự đơn lẻ cũng là thành viên của danh sách giết (ví dụ: "I", "a")
  4. Xóa ngẫu nhiên hai ký tự. danh sách (ví dụ: "an", "của")
  5. Xóa một từ ba ký tự ra ndom cũng là thành viên của danh sách giết (ví dụ "the", "và")
  6. Thay thế một hoặc nhiều từ ký tự bằng từ gồm ba ký tự đầu tiên và cuối cùng (ví dụ: "number" trở thành "numr", " màu sắc "trở thành" colrs ")
  7. Xóa nguyên âm một cách ngẫu nhiên
  8. Xóa một từ xảy ra với số lượng lớn các chuỗi trong v1. Ý tưởng là những từ rất phổ biến có giá trị thấp.
  9. Dịch một từ/cụm từ để một "vanity tấm giấy phép" từ ngắn hơn dựa trên một cuốn từ điển (từ điển) (chẳng hạn như http://www.baac.net/michael/plates/index.html)

(Lưu ý: hai chức năng cuối cùng sẽ yêu cầu quyền truy cập vào các chuỗi không thay đổi gì ban đầu và các thư từ giữa các từ chưa được thay đổi và thay đổi.)

Các vấn đề liên quan