Как сравнить список и вернуть совпадение и несоответствие в Python? - PullRequest
0 голосов
/ 21 июня 2019

как сравнить 2 списка одинаковой длины и вернуть элементы совпадений и не совпадений, которые нужно добавить как один элемент с пробелом

l1=["a","b","c"]
l2=["a","d","c"]

result=[]
for i in l1:
    for j in l2:
        if i == j:
            match = i
            result.append(match)
        else:
            non_match = i + " "+ j
            result.append(non_match)

print(result)

Actual Output:
['a', 'a d', 'a c', 'b a', 'b d', 'b c', 'c a', 'c d', 'c']

Expected Output:
["a","b d","c"]

Ответы [ 5 ]

2 голосов
/ 21 июня 2019

Пока порядок элементов в выходных данных не имеет значения, вы можете сделать это:

Output = list(map(lambda x: " ".join(set(x)), zip(List1, List2)))

>>> Output
['a', 'd b', 'c']

Логика может быть разбита следующим образом:

1: zip два списка вместе:

# display the zipped lists:
>>> list(zip(List1, List2))
[('a', 'a'), ('b', 'd'), ('c', 'c')]

2: превратить каждый кортеж в результирующем списке в набор (для получения уникальных значений):

# display the result of calling set on the zipped lists
>>> list(map(set, zip(List1, List2)))
[{'a'}, {'d', 'b'}, {'c'}]

3: объединить членовкаждый набор с join

Output = list(map(lambda x: " ".join(set(x)), zip(List1, List2)))
0 голосов
/ 21 июня 2019

Попробуйте:

[' '.join((a, b)) if a != b else a
 for a, b in zip(l1, l2)]

zip(l1, l2) может позволить вам итерировать l1, l2 одновременно, ''.join((a, b)) if a != b else a - это Conditional Expression, который выражает то, что вы хотите. Conditional Expression часть может быть оценена как значение, которое в конечном итоге будет агрегировано в желаемый результат через понимание списка.

0 голосов
/ 21 июня 2019

Другие ответы говорят другие методы, но я решаю вашу проблему. Проблема с вашим кодом заключается в том, что вы дважды просматриваете список python. Вы можете использовать функцию zip из python здесь. Я решил ваш код для вас.

l1=["a","b","c"]
l2=["a","d","c"]

result=[]
for i,j in zip(l1, l2):
    if i == j:
        match = i
        result.append(match)
    else:
        non_match = i + " "+ j
        result.append(non_match)

print(result)
0 голосов
/ 21 июня 2019

Вы также можете использовать collections.Counter():

from collections import Counter

l1 = ["a", "b", "c"]
l2 = ["a", "d", "c"]

union = Counter(l1 + l2)
unique, difference = list(), list()
for k, v in union.items():
    if v == 1:
        difference.append(k)
    else:
        unique.append(k)
unique.append(' '.join(difference))
result = sorted(unique)
print(result)
0 голосов
/ 21 июня 2019

Перебрать оба списка, добавляя пробел и элемент List2, если соответствующие элементы не равны друг другу.

[List1[i] + (f" {List2[i]}" if List1[i] != List2[i] else '') for i in range(len(List1))]

Я добавлю ответ @ grind также для полноты. Я думаю, что нам обоим это нравится немного лучше. Как уже упоминалось, для этого не нужны индексы, а форматирование также включает в себя объединение влево и вправо, что я тоже считаю улучшением.

[left if left == right else f'{left} {right'} for left, right in zip(List1, List2)]

Первый вызовет ошибку IndexError, если длины двух списков различны. Второе приведет к созданию нового списка, длина которого равна короткому из двух входных списков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...