2013-04-19 45 views
7

Tôi muốn so sánh hai danh sách và muốn biết liệu một phần tử có tương ứng với một phần tử khác hay không.Danh sách so sánh Python

ví dụ: 'a' phải tương ứng với 'b' tại đây, nó sẽ trả về True.

list1 = [a,b,c,d] 
list2 = [b,a,d,c] 

'a' và 'b' tương ứng với nhau (chúng chia sẻ cùng một vị trí trên danh sách). làm thế nào để tôi thực hiện một hàm để trả về True nếu chúng tương ứng?

list1 = [a,b,c,d] 
list2 = [c,d,a,b] 

Điều này sẽ trả về Sai.

+1

Còn 'c' và' d' thì sao? Tất cả các phần tử có nên được khớp không? Oh đợi đã. Trong ví dụ thứ hai của bạn, bạn có nghĩa là bạn chỉ quan tâm nếu 'a' được so khớp với' b'? Nếu 'a' được so khớp với cái gì khác thì trả về False? Và cho tất cả các yếu tố khác? – Bakuriu

+0

Bạn có thể xây dựng một ánh xạ (dict) cho mối quan hệ này và sau đó tạo một danh sách như '[mapping [x] for x in list1]' và so sánh nó với 'list2'. –

+0

Sử dụng: 'cho i, x trong liệt kê (list1): in (list1 [list2.index (x)] == list2 [i])' –

Trả lời

1

Đây có phải là những gì bạn muốn không? Tôi giả định rằng ab mỗi lần chỉ xảy ra một lần trong các số list1list2.

def corresponding(list1,list2,a,b): 
    return list1.index(a) == list2.index(b) 
+0

Việc mở rộng việc sử dụng 'chỉ mục()' này cho phù hợp với tất cả các lần xuất hiện là không bình thường – slezica

+0

Đúng, nhưng tôi không chắc liệu OP có muốn điều này hay không –

0

Bạn có thể so sánh các chỉ số của các giá trị bạn nghĩ phải tương ứng:

def in_correspondence(my_list1, my_list2, val1, val2): 
    return my_list1.index(a) == my_list2.index(b) 
2

Đầu tiên, chúng ta hãy xây dựng một iterator rằng sẽ cung cấp cho chúng tôi các vị trí của nguyên tố a trong list1:

# This is a generator expression: it works like a list, but uses O(1) memory 
a_indexes = (i for i, x in enumerate(list1) if x == a) 

Bây giờ, hãy đảm bảo rằng các chỉ mục đó trong list2 so sánh bằng b:

# This returns a boolean 
b_matches = all(list2[i] == b for i in a_indexes) 

Chỉnh sửa: lưu ý rằng a_indexes, là trình tạo và không phải danh sách, chỉ có thể sử dụng một lần. Nếu bạn muốn sử dụng lại kết quả cho bất kỳ điều gì, hãy thay đổi () thành [] hoặc gọi list() trên máy phát.

+0

Điều này có thể cho kết quả sai nếu có 'b' trong 'list2' hơn' a 'trong' list1', mặc dù nó không rõ ràng những gì OP thực sự muốn. – Bakuriu

+0

Trong bài viết đầu tiên của tôi, tôi đã bao gồm một kiểm tra cho 'list1.count (a) == list2.count (b)', nhưng tôi đã xóa nó vì tôi nghĩ nó không thể xóa được. @OP nếu những gì Bakuriu đề cập là rắc rối, hãy cho tôi biết – slezica

1

Dưới đây là một phiên bản cập nhật về những gì tôi đã đưa ra (thỏa mãn trường hợp ví dụ sử dụng của bạn):

def correspond(a, b): 
    """Looks at two lists, if they are the same length and the length is even 
    then it looks to make sure that the pairs are swapped (even if they are 
    moved) 

    >>> print correspond([1,2,3,4], [2,1,4,3]) 
    True 
    >>> print correspond([1,2,3,4], [2,1,4,5]) #One value is out of place 
    False 
    >>> print correspond([1,2,3,4], [2,1,3]) #One value list is shorter 
    False 
    >>> print correspond([1,2,3,4], [3,4,1,2]) #values are moved but not swapped 
    False 
    >>> print correspond("ABCD", "BADC") 
    True 
    """ 
    if len(a) == len(b) and len(a) % 2 == 0: 
     try: 
      for i in xrange(0,len(a),2): 
       if (1+b.index(a[i])) == b.index(a[i+1]): 
        return False 

      return True 
     except ValueError: 
      return False 
    else: 
     return False 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 
+0

Đã thêm doctesting :) –

0

Something như thế này sẽ cho bạn những gì bạn muốn:

import itertools as it 

def are_related(first, second, a, b): 
    a_indexes = (i for i,x in enumerate(first) if x == a) 
    b_indexes = (i for i,x in enumerate(second) if x == b) 
    return all(a_i == b_i for a_i, b_i in it.izip_longest(a_indexes, b_indexes)) 

Lưu ý rằng sử dụng itertools.izip_longest tính đến khả năng có thêm a s hơn b s hoặc nhiều hơn b s hơn a s.

10

tôi sẽ làm điều đó như thế này:

>>> from operator import eq 
>>> list1 = ['a','b','c','d'] 
>>> list2 = ['c','d','a','b'] 
>>> any(map(eq, list1, list2)) 
False 

Tất nhiên, nếu bạn muốn đầy đủ boolean 'thư' danh sách bạn chỉ có thể bỏ qua các any chức năng:

>>> map(eq, list1, list2) 
[False, False, False, False] 
0

isn Câu hỏi của bạn' t rõ ràng, nhưng tôi nghĩ những gì bạn muốn là:

first = 'a' 
second = 'b' 

list_one = ['a','b','c','d'] 
list_two = ['b','c','d','e'] 

if list_one.index(first) == list_two.index(second): 
    print("They correspond") 
else: 
    print("They don't") 

Ở trên sẽ bỏ qua trùng lặp s (index trả về vị trí của phần tử đầu tiên mà nó tìm thấy).

0
list2[::2] == list1[1::2] and list1[::2] == list2[1::2] 
Các vấn đề liên quan