Сравнение 2-ух списков в python
Нужно сравнить два списка и совпадающие элементы вывести в отдельный список,скажем, result. Такой вопрос уже был, но я никак не могу понять как одинаковые элементы вывести.
Отслеживать
51.2k 86 86 золотых знаков 266 266 серебряных знаков 505 505 бронзовых знаков
задан 3 июн 2015 в 17:58
143 1 1 золотой знак 4 4 серебряных знака 11 11 бронзовых знаков
похожий вопрос: Compare lists to find common elements in python
4 июн 2015 в 19:48
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Все таки Python динамичен и выразителен. Этого у него не отнять.
Вот Ваш однострочник:
result=list(set(Ans) & set(Word))
Это даст пересечение обоих списков:
['red', 'white']
Если нужен список уникальных элементов в объединении двух списков:
['red', 'white', 'green', 'blue'] result = list(set(Ans + Word))
['green','blue'] result=list(set(Ans) ^ set(Word))
Обычная разность(Множество из Ans не входящее в Word ):
['green','blue'] result=list(set(Ans) - set(Word))
Вариант, сохраняющий порядок с меньшим количеством конверсий типов:
sbuf = set(Word) result = [x for x in Ans if x in sbuf)]
Отслеживать
ответ дан 3 июн 2015 в 18:24
7,786 1 1 золотой знак 28 28 серебряных знаков 49 49 бронзовых знаков
Спасибо за исчерпывающий ответ, принял.
4 июн 2015 в 15:44
@ламер: Для поддержки повторяющихся значений можно collections.Counter вместо set использовать. Нужно быть осторожно с выражениями типа: x in set(Word) оно создаёт множество заново для каждого элемента (можно просто вывести создание множества из цикла). В последнем выражении result может дубликаты содержать и сам результат не симметричен. Нет никакой необходимости преобразовывать set() в list() обратно: порядок и повторные элементы уже потеряны: result = set(Ans).intersection(Word) (здесь также не нужно второе множество создавать). Для полноты хэширование стоит упомянуть.
Сравнение и идентичность двух списков в Python
Если нужен список уникальных элементов в объединении двух списков:
result = list(set(lst1 + lst2)) # ['red', 'white', 'green', 'blue']
Симметричная разность двух списков:
result = list(set(lst1) ^ set(lst2)) # ['green', 'blue']
Обычная разность(множество из lst1 не входящее в lst2 ):
result = list(set(lst1) - set(lst2)) # ['green','blue']
Вариант, сохраняющий порядок с меньшим количеством конверсий типов:
result = [x for x in lst1 if x in set(lst2))]
Как сравнить поиндексно значения двух списков?
Имеем два списка:
lit1 = [23, 56, 78, 69] lit2 = [11, 89, 33, 45]
Задача состоит в том, чтобы сравнить эти списки поиндексно, при сравнении меньший элемент вынести в отдельный список result .
Смотрим решение с комментариями к коду:
list1 = [23, 56, 78, 69] list2 = [11, 89, 33, 45] # список для результата result = [] # перебираем элементы списка # в пределах длины первого списка for i in range(len(lst1)): # сравниваем элементы первого списка # с элементами второго списка if lst1[i] lst2[i]: # добавляем в итоговый список `result` # элемент из первого, если он меньше result.append(list1[i]) else: # иначе - добавляем элемент из второго списка result.append(list2[i]) # выводим итоговый список print(result)
Код выше можно записать короче, при помощи выражения-генератора списка или функции map()
result = [min(p) for p in zip(list1, list2)] # или result = list(map(min, zip(l1, l2)))
Вычисление идентичности двух списков в Python.
Задача состоит в том, чтобы проверить, содержат ли два списка точно одинаковые элементы. Это довольно полезная распространенная задача.
Так как оператор == сравнивает списки поиндексно слева направо, то решение состоит в том, чтобы перед сравнением эти списки отсортировать, ведь заранее неизвестно, упорядочены они или нет.
Метод списка list.sort() сортирует его на месте (т.е. не создает новый). Если необходимо сохранить начальную сортировку списков, то для сортировки используйте функцию sorted() , она создаст новый отсортированный список, который можно сравнивать.
lst1 = [5, 3, 1, 2, 4] lst2 = [1, 2, 4, 3, 5] if lst1.sort() == lst2.sort(): print('Списки идентичны') else: print('Списки не идентичны')
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Список Python как аргумент по умолчанию
- Использование списка в качестве стека
- Использование списка в качестве очереди
- Генератор списка list
- Эффективное использование генераторов списков
- Операция присваивания на месте и списки
- Поведение списков Python в разных областях видимости
- Сравнение и идентичность двух списков
- Как получить несколько последних элементов списка
Как сравнить два списка с частичным совпадением элементов?
Добрый день как можно сравнить два списка с частичным совпадением по элементам?
пытаюсь сделать так
files = ['новая папка', 'games', 'install', 'фото', 'музыка'] search = ['папка', 'фотки', 'музло'] result=list(set(search) & set(files)) print(result)
результат будет если в обеих списках будут одинаковые элементы
ожидаемый результат по частичному совпадению элементов между files и search:
[‘новая папка’, ‘фото’, ‘музыка’]
- Вопрос задан более года назад
- 363 просмотра
Комментировать
Решения вопроса 2
будет криво и не совсем корректно, но простого решения тут нет, надо брать и искать по семантическое сравнение
import re files = ['новая папка', 'games', 'install', 'фото', 'музыка'] search = ['папка', 'фотки', 'музло'] finds = set() chars_find = re.compile(r'\w') for file in files: for world_search in search: for world in chars_find.findall(world_search): if world in file: finds.add(file) print(finds)
Ответ написан более года назад
Комментировать
Нравится 1 Комментировать
Владимир Куц @fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Нечеткий поиск:
from fuzzywuzzy import fuzz files = ['новая папка', 'games', 'install', 'фото', 'музыка'] search = ['папка', 'фотки', 'музло'] result = [] for im in search: for fil in files: if fuzz.partial_ratio(im, fil) > 50: result.append(fil) print(result) # ['новая папка', 'фото', 'музыка']
Пересечение списков, совпадающие элементы двух списков
В данной задаче речь идет о поиске элементов, которые присутствуют в обоих списках. При этом пересечение списков и поиск совпадающих (перекрывающихся) элементов двух списков будем считать несколько разными задачами.
Если даны два списка, в каждом из которых каждый элемент уникален, то задача решается просто, так как в результирующем списке не может быть повторяющихся значений. Например, даны списки:
[5, 4, 2, ‘r’, ‘ee’] и [4, ‘ww’, ‘ee’, 3]
Областью их пересечения будет список [4, ‘ee’] .
Если же исходные списки выглядят так:
[5, 4, 2, ‘r’, 4, ‘ee’, 4] и [4, ‘we’, ‘ee’, 3, 4] ,
то списком их совпадающих элементов будет [4, ‘ee’, 4] , в котором есть повторения значений, потому что в каждом из исходных списков определенное значение встречается не единожды.
Начнем с простого — поиска области пересечения. Cначала решим задачу «классическим» алгоритмом, не используя продвинутые возможностями языка Python: будем брать каждый элементы первого списка и последовательно сравнивать его со всеми значениями второго.
a = [5, [1, 2], 2, 'r', 4, 'ee'] b = [4, 'we', 'ee', 3, [1, 2]] c = [] for i in a: for j in b: if i == j: c.append(i) break print(c)
Результат выполнения программы:
[[1, 2], 4, 'ee']
Берется каждый элемент первого списка (внешний цикл for ) и последовательно сравнивается с каждым элементом второго списка (вложенный цикл for ). В случае совпадения значений элемент добавляется в третий список c . Команда break служит для выхода из внутреннего цикла, так как в случае совпадения дальнейший поиск при данном значении i бессмыслен.
Алгоритм можно упростить, заменив вложенный цикл на проверку вхождения элемента из списка a в список b с помощью оператора in :
a = [5, [1, 2], 2, 'r', 4, 'ee'] b = [4, 'we', 'ee', 3, [1, 2]] c = [] for i in a: if i in b: c.append(i) print(c)
Здесь выражение i in b при if по смыслу не такое как выражение i in a при for . В случае цикла оно означет извлечение очередного элемента из списка a для работы с ним в новой итерации цикла. Тогда как в случае if мы имеем дело с логическим выражением, в котором утверждается, что элемент i есть в списке b . Если это так, и логическое выражение возвращает истину, то выполняется вложенная в if инструкция, то есть элемент i добавляется в список c .
Принципиально другой способ решения задачи – это использование множеств. Подходит только для списков, которые не содержат вложенных списков и других изменяемых объектов, так как встроенная в Python функция set() в таких случаях выдает ошибку.
a = [5, 2, 'r', 4, 'ee'] b = [4, 1, 'we', 'ee', 'r'] c = list(set(a) & set(b)) print(c)
['ee', 4, 'r']
Выражение list(set(a) & set(b)) выполняется следующим образом.
- Сначала из списка a получают множество с помощью команды set(a) .
- Аналогично получают множество из b .
- С помощью операции пересечения множеств, которая обозначается знаком амперсанда & , получают третье множество, которое представляет собой область пересечения двух исходных множеств.
- Полученное таким образом третье множество преобразуют обратно в список с помощью встроенной в Python функции list() .
Множества не могут содержать одинаковых элементов. Поэтому, если в исходных списках были повторяющиеся значения, то уже на этапе преобразования этих списков во множества повторения удаляются, а результат пересечения множеств не будет отличаться от того, как если бы в исходных списках повторений не было.
Однако если мы вернемся к решению задачи без использования множеств и добавим в первый список повтор значения, то получим некорректный результат:
В список пересечения попадают оба равных друг другу значения из первого списка. Это происходит потому, что когда цикл извлекает, в данном случае, вторую 4-ку из первого списка, выражение i in b также возвращает истину, как и при проверке первой 4-ки. Следовательно, выражение c.append(i) выполняется и для второй четверки.
Чтобы решить эту проблему, добавим дополнительное условие в заголовок инструкии if . Очередной значение i из списка a должно не только присутствовать в b , но его еще не должно быть в c . То есть это должно быть первое добавление такого значения в c :
a = [5, 2, 'r', 4, 'ee', 4] b = [4, 'we', 'ee', 3] c = [] for i in a: if i in b and i not in c: c.append(i) print(c)
[4, 'ee']
Теперь усложним задачу. Пусть если в обоих списках есть по несколько одинаковых значений, они должны попадать в список совпадающих элементов в том количестве, в котором встречаются в списке, где их меньше. Или если в исходных списках их равное количетво, то такое же количество должно быть в третьем. Например, если в первом списке у нас три 4-ки, а во втором две, то в третьем списке должно быть две 4-ки. Если в обоих исходных по две 4-ки, то в третьем также будет две.
Алгоритмом решения такой задачи может быть следующий:
- В цикле будем перебирать элементы первого списка.
- Если на текущей итерации цикла взятого из первого списка значения нет в третьем списке, то только в этом случае следует выполнять все нижеследующие действия. В ином случае такое значение уже обрабатывалось ранее, и его повторная обработка приведет к добавлению лишних элементов в результирующий список.
- С помощью спискового метода count() посчитаем количество таких значений в первом и втором списке. Выберем минимальное из них.
- Добавим в третий список количество элементов с текущим значением, равное ранее определенному минимуму.
a = [5, 2, 4, 'r', 4, 'ee', 1, 1, 4] b = [4, 1, 'we', 'ee', 'r', 4, 1, 1] c = [] for item in a: if item not in c: a_item = a.count(item) b_item = b.count(item) min_count = min(a_item, b_item) # c += [item] * min_count for i in range(min_count): c.append(item) print(c)
[4, 4, 'r', 'ee', 1, 1]
Если значение встречается в одном списке, но не в другом, то метод count() другого вернет 0. Соответственно, функция min() вернет 0, а цикл с условием i in range(0) не выполнится ни разу. Поэтому, если значение встречается в одном списке, но его нет в другом, оно не добавляется в третий.
При добавлении значений в третий список вместо цикла for можно использовать объединение списков с помощью операции + и операцию повторения элементов с помощью * . В коде выше данный способ показан в комментарии.
X Скрыть Наверх
Решение задач на Python