2011-12-17 39 views
9

Tôi có hai chuỗi có độ dài bằng nhau, làm thế nào tôi có thể tìm thấy tất cả các vị trí mà các chuỗi khác nhau?Tìm vị trí của sự khác biệt giữa hai chuỗi

Ví dụ, "HELPMEPLZ" và "HELPNEPLX" là khác nhau tại các vị trí 4 và 8.

+0

trông giống như bài tập về nhà với tôi. cho thấy những gì bạn đã thử và nơi bạn có vấn đề, sau đó cố gắng đặt câu hỏi cụ thể – tback

+0

Nó không phải là bài tập về nhà, tôi cần nó cho một functioncomplex lớn hơn nhiều. Vì vậy, hơi khó để viết tất cả mọi thứ ở đây .. –

+0

Nhưng các chức năng chia các chuỗi lên: ('HEL', 'PME', 'PLZ') và ('HEL', 'PNE', 'PLX') –

Trả lời

2

Nếu bạn lưu trữ hai chuỗi trong ab, bạn lặp qua tất cả các mục và có thể kiểm tra bất bình đẳng.

python phiên dịch tương tác:

>>> for i in range(len(a)): 
... if a[i] != b[i]: print i, a[i], b[i] 
... 
4 M N 
8 Z X 

Một cách khác để làm điều này là với comprehensions danh sách. Đó là tất cả trong một dòng, và đầu ra là một danh sách.

>>> [i for i in range(len(a)) if a[i] != b[i]] 
[4, 8] 

Điều đó làm cho việc chèn vào một chức năng rất dễ dàng, điều này làm cho nó dễ dàng hơn.

>>> def dif(a, b): 
...  return [i for i in range(len(a)) if a[i] != b[i]] 
... 
>>> dif('HELPMEPLZ', 'HELPNEPLX') 
[4, 8] 
>>> dif('stackoverflow', 'stacklavaflow') 
[5, 6, 7, 8] 
+0

Không sử dụng lambda khi bạn không phải: 'def dif (a, b): trả về [i cho i trong phạm vi (len (a)) nếu [i]! = B [i]]' –

+0

@ StevenRumbalski, tại sao không? Nó cũng chính xác ... theo như tôi biết. Có ít Pythonic hơn không? Hoặc chậm hơn? – FakeRainBrigand

+0

Lambdas dành cho * chức năng ẩn danh * và tuyệt vời để tạo một lớp lót. Ở đây, bạn chỉ định một tên cho lambda, điều này gợi ý rằng nó sẽ tốt hơn như một hàm bình thường. Ngoài ra, lambdas che khuất truy nguyên của bạn khi bạn gặp lỗi .. –

1

Cách dễ nhất là chia dữ liệu thành hai mảng char và sau đó lặp lại so sánh các chữ cái và trả về chỉ mục khi hai ký tự không bằng nhau.

Phương pháp này sẽ hoạt động tốt miễn là cả hai chuỗi có chiều dài bằng nhau.

1

Ghép chuỗi ký tự theo từng ký tự và lặp lại trên bộ sưu tập này cùng với chỉ mục đếm. Kiểm tra xem các ký tự trong mỗi cặp có khác nhau hay không; nếu có, hãy xuất chỉ mục ở đâu.

Sử dụng Python chức năng được xây dựng trong bạn có thể làm điều này ngay ngắn trong một dòng:

>>> x = 'HELPMEPLZ' 
>>> y = 'HELPNEPLX' 
>>> {i for i, (left, right) in enumerate(zip(x,y)) if left != right} 
{8, 4} 
+0

Mặc dù OP không nói như vậy, tôi sẵn sàng đặt cược rằng một giải pháp tạo ra các chỉ số sai lệch theo thứ tự tăng dần sẽ thích hợp hơn. –

+0

@Linus: nếu bạn muốn điều này, thay đổi '{}' dấu ngoặc vuông thành '[]'. Điều đó sẽ cung cấp cho bạn một danh sách hiểu thay vì một thiết lập hiểu, do đó, bảo tồn trật tự. – katrielalex

4
>>> from itertools import izip 
>>> s1 = 'HELPMEPLZ' 
>>> s2 = 'HELPNEPLX' 
>>> [i for i,(a1,a2) in enumerate(izip(s1,s2)) if a1!=a2] 
[4, 8] 
18

Hãy thử điều này:

s1 = 'HELPMEPLZ' 
s2 = 'HELPNEPLX' 
[i for i in xrange(len(s1)) if s1[i] != s2[i]] 

Nó sẽ trở lại:

> [4, 8] 

Trên đây giải pháp sẽ trả về một danh sách w ith các chỉ mục theo thứ tự sắp xếp, sẽ không tạo ra bất kỳ cấu trúc dữ liệu trung gian không cần thiết nào và nó sẽ hoạt động trên Python 2.3 - 2.7. Đối với Python 3.x, hãy thay thế xrange cho range.

+0

'zip' là một trình lặp trong Python 3. Không chắc chắn ý bạn là gì bởi Python 2.3 bình luận. – katrielalex

+0

Điều này có nghĩa là nó không sử dụng các tính năng đặc trưng của Python 3 - như giả định rằng zip là một trình lặp, hoặc có sẵn các thiết lập hiểu. Giải pháp của tôi hoạt động hiệu quả ngay cả trong các phiên bản Python cũ hơn, miễn là khả năng đọc danh sách có sẵn –

+0

Đặt hiểu là trong Python 2.7. – katrielalex

9

Python thực sự đi kèm với pin đi kèm. Có một cái nhìn tại difflib

>>> import difflib 
>>> a='HELPMEPLZ' 
>>> b='HELPNEPLX' 
>>> s = difflib.SequenceMatcher(None, a, b) 
>>> for block in s.get_matching_blocks(): 
...  print block 
Match(a=0, b=0, size=4) 
Match(a=5, b=5, size=3) 
Match(a=9, b=9, size=0) 

difflib là rất mạnh mẽ và một nghiên cứu một số tài liệu được thực sự khuyến khích.

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