2013-04-19 19 views
7

Chcę porównać dwie listy i chcę wiedzieć, czy element odpowiada innemu elementowi.Python Porównywanie list

przykład: "A" powinno odpowiadać "b" , tutaj zwróci wartość True.

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

"a" i "b" odpowiadają sobie nawzajem (mają to samo miejsce na listach). jak utworzyć funkcję, aby zwrócić True, jeśli odpowiadają?

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

To by zwróciło Fałsz.

+1

Co z 'c' i' d'? Czy wszystkie elementy powinny być dopasowane? Zaczekaj. W twoim drugim przykładzie masz na myśli, że zależy ci tylko na tym, że "a" jest dopasowane do 'b'? Jeśli "a" jest dopasowane do czegoś innego, to zwróć Fałsz? I dla wszystkich innych elementów? – Bakuriu

+0

Możesz skonstruować odwzorowanie (dict) dla tej relacji, a następnie utwórz listę, taką jak '[mapping [x] dla x na liście1]' i porównaj ją z 'list2'. –

+0

Użyj: 'dla i, x w wyliczeniu (list1): drukuj (lista1 [lista2.indeks (x)] == lista2 [i])' –

Odpowiedz

1

Czy tego chcesz? Zakładam, że każdy z nich występuje tylko raz w odpowiednio a i b.

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

Rozszerzenie tego użycia 'index()', aby dopasować wszystkie wystąpienia, nie jest banalne. – slezica

+0

To prawda, ale nie jestem pewien, czy OP chce tego mimo wszystko. –

0

Można porównać wskaźniki wartości myślisz powinny odpowiadać:

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

Najpierw zbudujmy iterator, które dadzą nam pozycje elementu a w 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) 

Teraz upewnijmy się, że te indeksy w zestawie list2 są równe b:

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

Edytuj: zauważ, że a_indexes, będąc generatorem, a nie listą, można użyć tylko jeden raz. Jeśli chcesz ponownie użyć wyników dla czegokolwiek, zmień () na [] lub wywołaj list() na generatorze.

+0

Może to dawać fałszywe alarmy, jeśli istnieją więcej 'b's w' list2' niż 'a's w' list1', mimo że nie jest jasne, czego naprawdę chce OP. – Bakuriu

+0

W moim pierwszym wpisie, włączyłem czek dla 'list1.count (a) == list2.count (b)', ale usunąłem go, ponieważ myślałem, że to było niepożądane. @OP jeśli Bakuriu wspomina o kłopotach, daj mi znać – slezica

1

Tutaj jest zaktualizowana wersja tego, co wymyśliłem (który spełnia swoje przypadki przykład używać):

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

Dodano doctesting :) –

0

Coś jak to powinno dać ci to, co chcesz:

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)) 

Należy pamiętać, że użycie parametru itertools.izip_longest uwzględnia prawdopodobieństwo więcej niż a s niż b s lub więcej niż b s niż b s.

10

zrobiłbym to tak:

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

Oczywiście, jeśli chcesz w pełni logiczną „korespondencja” listy można po prostu pominąć any funkcję:

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

Twoje pytanie ISN” Jasne, ale myślę, że to, czego chcesz, to:

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") 

Powyższe zignoruje duplikat s (index zwraca pozycję pierwszego znalezionego elementu).

0
list2[::2] == list1[1::2] and list1[::2] == list2[1::2]