@pypyshka

Как из двух списков сделать один?

Добрый день. Помогите, пожалуйста, решить задачку. Есть два списка:
a = [('1', 'a', 'b', 'c'), ('2', 'x', 'y', 'z'), ('3', 'x', 'y', 'z')]
b = [('a', 'b', 'c', 'd'), ('x', 'y', 'z', 'w'), ('x', 'y', 'z', 'w'), ('u', 'o', 'n', 'm')]

Нужно найти совпадения элементов первого списка со элементами второго, и если такие совпадения есть, то объединить их. Например, если 1, 2 и 3 элементы 0 кортежа списка a совпадают с 0, 1 и 2 элементом 0 кортежа списка b, то мы берём 0 элемент 0 кортежа списка a и добавляем его в 0 позицию 0 кортежа списка b, то есть получаем result = ['1', 'a', 'b', 'c', 'd'].
Также 1 и 2 кортеж списка a имеет совпадения с 1 и 2 кортежем списка b и результат должен быть: ['2', 'x', 'y', 'z', 'w'] и ['3', 'x', 'y', 'z', 'w'] соответственно.

Я пробовал найти совпадения так:

total = []
for i in a:
    for y in b:
        if i[1:4] == y[0:3]:
            print("Совпадение: ", "i = ", i[1:4], "y = ", y[0:3])
            result = list(y)
            result.insert(0, i[0])
            print("result :", result)
            total.append(result)
print("total :", total)

Проблема заключается в том, что 1 и 2 кортеж списка b одинаковые, поэтому в результат total попадают дубликаты значений result. Можно ли как-то убрать дубликаты в total, чтобы получить в итоге [['1', 'a', 'b', 'c', 'd'], ['2', 'x', 'y', 'z', 'w'], ['3', 'x', 'y', 'z', 'w']], или есть другие пути решения?
  • Вопрос задан
  • 541 просмотр
Решения вопроса 1
aRegius
@aRegius
Python Enthusiast
Добрый вечер, pypyshka.

Воспользуйтесь функцией map().

>>> a = [('1', 'a', 'b', 'c'), ('2', 'x', 'y', 'z'), ('3', 'x', 'y', 'z')]
>>> b = [('a', 'b', 'c', 'd'), ('x', 'y', 'z', 'w'), ('x', 'y', 'z', 'w'), ('u', 'o', 'n', 'm')]
>>> new_list = lambda x, y: [i for i in x] + [i for i in y if i not in x]
>>> new_result = list(map(new_list, a, b))
>>> new_result
[['1', 'a', 'b', 'c', 'd'], ['2', 'x', 'y', 'z', 'w'], ['3', 'x', 'y', 'z', 'w']]
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@fdrwitch
Если все-таки сравниваются только соответствующие кортежи из списков (нулевой с нулевым, первый с первым...), то тут может быть вариант с множествами и одним фор.....
a = [('1', 'a', 'b', 'c'), ('2', 'x', 'y', 'z'), ('3', 'x', 'y', 'z')]
b = [('a', 'b', 'c', 'd'), ('x', 'y', 'z', 'w'), ('x', 'y', 'z', 'w', 'p'), ('u', 'o', 'n', 'm')]
final = []
for i in range(len(min(a,b))):
final.append(sorted(tuple(set(a[i]) | set(b[i]))))
final
[['1', 'a', 'b', 'c', 'd'],
['2', 'w', 'x', 'y', 'z'],
['3', 'p', 'w', 'x', 'y', 'z']]
Ответ написан
Комментировать
@pypyshka Автор вопроса
С помощью:

for i in a:
    for y in b:
        if i[1:4] == y[0:3]:
            print("Совпадение: ", "i = ", i[1:4], "y = ", y[0:3])
            result = list(y)
            result.insert(0, i[0])
            print("result :", result)
            if result not in total:
                total.append(result)
print("total :", total)

получилось вывести: total : [['1', 'a', 'b', 'c', 'd'], ['2', 'x', 'y', 'z', 'w'], ['3', 'x', 'y', 'z', 'w']].
Но если во 2 кортеже изменится значение элемента:
b = [('a', 'b', 'c', 'd'), ('x', 'y', 'z', 'w'), ('x', 'y', 'z', 'p'), ('u', 'o', 'n', 'm')]
то мы получаем:
total : [['1', 'a', 'b', 'c', 'd'], ['2', 'x', 'y', 'z', 'w'], ['2', 'x', 'y', 'z', 'p'], ['3', 'x', 'y', 'z', 'w'], ['3', 'x', 'y', 'z', 'p']].
Можно ли как это привести к виду total : [['1', 'a', 'b', 'c', 'd'], ['2', 'x', 'y', 'z', 'w'], ['3', 'x', 'y', 'z', 'p']]?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы