Сравнение списков списков Python
У меня есть список, содержащий 10 ** 7 списков в формате:
big_list = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]]
Каждый список содержит 6 уникальных ints.
Мне нужно сравнить каждый список с другим списком:
lst = [1, 3, 4, 10, 23, 46]
и вернуть те, где пересечение элементов списка меньше 3. Таким образом, новый список будет:
new_list = [[2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40]]
На данный момент я использую set intersection, но для запуска требуется около 30 секунд
- Как сравнить функции python с точки зрения производительности?
- Сравнить список словарей с разницей в одном словаре
- Сравнение списков, содержащих NaN
- Как сравнить результаты двух файлов CSV в Python с DictReader или Pandas? (Открыта для любых других методов!)
- как получить элементы, принадлежащие всем массивам numpy?
>>> big_list = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]] >>> normal = set([1, 3, 4, 10, 23, 46]) >>> [x for x in big_list if len(set(x).intersection(normal)) < 3] [[2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40]]
import numpy as np biglist = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]] oldlist = [1, 3, 4, 10, 23, 46] b = np.array(biglist) b[np.array([(b == x).any(axis=1) for x in oldlist]).sum(axis=0) < 3]
возвращается
array([[ 2, 3, 4, 5, 6, 7], [ 2, 3, 4, 26, 33, 40]])
Создание массива numpy занимает некоторое время, но последняя строка примерно в два раза быстрее, чем понимание списка с заданными пересечениями (для списков 1е6).
EDIT: следующая строка еще быстрее, чем мой код выше и требует меньше памяти:
b[reduce(np.add, ((b == x).any(axis=1).astype(np.int) for x in oldlist)) < 3]
Я думаю, что «быстрое» решение должно зависеть от спецификации вашей проблемы. Например, если ваш список ссылок так же короток, как [1, 3, 4, 10, 23, 46], отсортировав каждый список, мы сразу увидим, что все списки, начинающиеся с числа больше 10, например [ 11, x, x, …] не будет иметь более трех общих элементов со ссылкой. Это могло бы сэкономить много сравнений.
- используя bisect в списке кортежей, но сравните, используя только первое значение
- Python – Сравнить список списков и выбрать наибольшее значение
- Найти совпадающие точки в 2 отдельных массивах numpy
- Сортировка словаря python после запуска функции itertools
- Сравнение производительности в Python: равное и не равное
- Лучший способ получить строку запроса из URL-адреса в python?
- Поиск определенных столбцов таблицы для несоответствующих элементов
- Какое хранилище ключей / ценностей является наиболее перспективным / стабильным?
- Сравнение двух полей фильтра django