2015-04-28 65 views
6

Đây là vấn đề về toán học nhiều hơn bất kỳ vấn đề nào khác. Cho phép giả sử tôi có hai danh sách của các kích cỡ khác nhau bằng PythonTỷ lệ phần trăm chồng chéo của hai danh sách

listA = ["Alice", "Bob", "Joe"] 
listB = ["Joe", "Bob", "Alice", "Ken"] 

Tôi muốn tìm hiểu bao nhiêu phần trăm chồng chéo hai danh sách này có. Đặt hàng không quan trọng trong danh sách. Tìm chồng chéo dễ dàng, tôi đã nhìn thấy các bài viết khác về cách làm điều đó nhưng tôi không thể mở rộng nó trong tâm trí của tôi để tìm ra tỷ lệ phần trăm họ chồng lên nhau. Nếu tôi so sánh các danh sách theo các đơn đặt hàng khác nhau thì kết quả có khác đi không? Điều gì sẽ là cách tốt nhất để làm điều này?

+0

Thứ tự không quan trọng ở đây nhiều, Tuy nhiên, trước tiên bạn cần phải xác định công thức cho phần trăm, nó có thể là một số thứ như: '2 * số đối sánh/(len (lista) + len (listb))' hoặc cái gì khác – ZdaR

+1

Điều gì sẽ xảy ra nếu lis ts là '[1,1,1]' và '[1]'. Chồng chéo có thể là 100% hay 33% không? –

+0

Đầu ra dự kiến ​​cho hai danh sách này là gì? – Ofiris

Trả lời

4

Sự khác biệt tối đa là khi hai danh sách có các yếu tố hoàn toàn khác nhau. Vì vậy, chúng tôi có tối đa n + m yếu tố rời rạc, trong đó n là kích thước của danh sách đầu tiên và m là kích thước của danh sách thứ hai. Một biện pháp có thể là:

2 * c/(n + m) 

trong đó c là số yếu tố chung. Điều này có thể được tính toán như thế này theo phần trăm:

200.0 * len(set(listA) & set(listB))/(len(listA) + len(listB)) 
+0

Điều này không thành công cho ví dụ sau: listA = ["Alice", "Alice"] listB = ["Alice", "Alice"] –

2
>>> len(set(listA)&set(listB))/float(len(set(listA) | set(listB))) * 100 
75.0 

tôi sẽ tính toán các mặt hàng thông thường trong tổng số các mặt hàng khác nhau.

len(set(listA)&set(listB)) trả về các mục phổ biến (3 trong ví dụ của bạn).

len(set(listA) | set(listB)) trả về tổng số mục riêng biệt (4).

Nhân với 100 và bạn nhận được tỷ lệ phần trăm.

+0

Lưu ý rằng câu trả lời này và câu trả lời @JuniorCompressor khác nhau, cả hai đều đúng nhưng phụ thuộc vào yêu cầu cụ thể. – Ofiris

2

Từ quan điểm chính của xem, tôi muốn nói rằng có hai câu hỏi hợp lý bạn có thể hỏi:

  1. nhiêu phần trăm sự chồng chéo là nếu so với danh sách đầu tiên? I E. phần phổ biến như thế nào so với danh sách đầu tiên?
  2. Điều tương tự cho danh sách thứ hai.
  3. Tỷ lệ phần trăm trùng lặp là gì nếu so sánh với "vũ trụ" (nghĩa là liên kết của cả hai danh sách)?

Chắc chắn cũng có thể tìm thấy các ý nghĩa khác và sẽ có nhiều ý nghĩa. Tất cả trong tất cả các bạn có lẽ nên biết những gì vấn đề bạn đang cố gắng để giải quyết.

Từ quan điểm lập trình của xem, giải pháp là đơn giản:

listA = ["Alice", "Bob", "Joe"] 
listB = ["Joe", "Bob", "Alice", "Ken"] 

setA = set(listA) 
setB = set(listB) 

overlap = setA & setB 
universe = setA | setB 

result1 = float(len(overlap))/len(setA) * 100 
result2 = float(len(overlap))/len(setB) * 100 
result3 = float(len(overlap))/len(universe) * 100 
0
def computeOverlap(L1, L2): 
    d1, d2 = {}, {} 
    for e in L1: 
     if e not in d1: 
      d1[e] = 1 
     d1[e] += 1 

    for e in L2: 
     if e not in d2: 
      d2[e] = 0 
     d2[e] += 1 

    o1, o2 = 0, 0 
    for k in d1: 
     o1 += min(d1[k], d2.get(k,0)) 
    for k in d2: 
     o2 += min(d1.get(k,0), d2[k]) 

    print((100*o1) if o1 else 0 "% of the first list overlaps with the second list") 
    print((100*o2) if o2 else 0 "% of the second list overlaps with the first list") 

Tất nhiên, bạn chỉ có thể làm điều này với một defaultdict và một quầy hàng, để làm cho mọi việc một chút dễ dàng hơn:

from collections import defaultdict, Counter 

def computeOverlap(L1, L2): 
    d1 = defaultdict(int, Counter(L1)) 
    d2 = defaultdict(int, Counter(L2)) 

    o1, o2 = 0, 0 
    for k in d1: 
     o1 += min(d1[k], d2[k]) 
    for k in d2: 
     o2 += min(d1[k,0], d2[k]) 

    print((100*o1) if o1 else 0 "% of the first list overlaps with the second list") 
    print((100*o2) if o2 else 0 "% of the second list overlaps with the first list") 
Các vấn đề liên quan