У меня есть два списка в Python, как эти:
temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two']
Мне нужно создать третий список с элементами из первого списка, которых нет во втором. Из примера я должен получить:
temp3 = ['Three', 'Four']
Есть ли быстрые способы без циклов и проверки?
python
performance
list
set
set-difference
Макс Фрай
источник
источник
temp1 = ['One', 'One', 'One']
иtemp2 = ['One']
вы хотите['One', 'One']
вернуться, или[]
?Ответы:
Остерегайтесь этого
где вы могли бы ожидать / хотите, чтобы оно равнялось
set([1, 3])
. Если вы хотите вset([1, 3])
качестве ответа, вам нужно использоватьset([1, 2]).symmetric_difference(set([2, 3]))
.источник
TypeError: 'str' object is not callable
когда я выполняю эту операциюa = [1,2,2,2,3]
иb = [2]
Все существующие решения предлагают одно или другое из:
Но до сих пор ни одно решение не имеет обоих. Если вы хотите оба, попробуйте это:
Тест производительности
Результаты:
Метод, который я представил, а также сохранение порядка также (немного) быстрее, чем вычитание набора, потому что он не требует создания ненужного набора. Разница в производительности была бы более заметной, если первый список значительно длиннее второго и если хэширование дорого. Вот второй тест, демонстрирующий это:
Результаты:
источник
источник
temp2
в набор раньше сделало бы это немного более эффективным.item not in temp2
иitem not in set(temp2)
всегда будет возвращать одинаковые результаты, независимо от того, есть ли дубликаты или нетtemp2
.Разницу между двумя списками (скажем, list1 и list2) можно найти с помощью следующей простой функции.
или
Используя вышеуказанную функцию, разницу можно найти с помощью
diff(temp2, temp1)
илиdiff(temp1, temp2)
. Оба дадут результат['Four', 'Three']
. Вам не нужно беспокоиться о порядке списка или о том, какой список нужно дать первым.Ссылка на документ Python
источник
Если вы хотите рекурсивное различие, я написал пакет для Python: https://github.com/seperman/deepdiff
Установка
Установить из PyPi:
Пример использования
Импорт
Тот же объект возвращает пустой
Тип предмета изменился
Стоимость предмета изменилась
Товар добавлен и / или удален
Разница строк
Разница строк 2
Изменение типа
Разница в списке
Разница в списке 2:
Разница в списке, игнорирующая порядок или дубликаты: (с теми же словарями, что и выше)
Список, содержащий словарь:
Наборы:
Именованные кортежи:
Пользовательские объекты:
Добавлен атрибут объекта:
источник
Может быть сделано с помощью оператора XOR python.
источник
самый простой способ,
используйте set (). разность (set ())
ответ
set([1])
можно распечатать в виде списка,
источник
Если вы действительно смотрите на производительность, используйте numpy!
Вот полная тетрадь в виде github со сравнением между list, numpy и pandas.
https://gist.github.com/denfromufa/2821ff59b02e9482be15d27f2bbd4451
источник
я добавлю, так как ни одно из настоящих решений не дает кортеж:
альтернативно:
Как и другие ответы, не отвечающие на кортежи в этом направлении, он сохраняет порядок
источник
Я хотел что бы принять два списка и может делать то , что
diff
вbash
делает. Так как этот вопрос всплывает первым при поиске «python diff два списка» и не очень конкретен, я опубликую то, что придумал.Используя
SequenceMather
fromdifflib
вы можете сравнить два списка, как этоdiff
делает. Ни один из других ответов не скажет вам положение, в котором происходит различие, но этот ответ делает. Некоторые ответы дают разницу только в одном направлении. Некоторые переупорядочивают элементы. Некоторые не обрабатывают дубликаты. Но это решение дает вам истинную разницу между двумя списками:Это выводит:
Конечно, если ваше приложение делает те же предположения, что и другие ответы, вы извлечете из них наибольшую пользу. Но если вы ищете настоящую
diff
функциональность, то это единственный путь.Например, ни один из других ответов не может обработать:
Но этот делает:
источник
Попробуй это:
источник
это может быть даже быстрее, чем понимание списка Марка:
источник
from itertools import filterfalse
сюда немного. Также обратите внимание, что это не возвращает последовательность, как другие, это возвращает итератор.Вот
Counter
ответ для простейшего случая.Это короче, чем приведенный выше, который выполняет двусторонние сравнения, потому что он делает только то, что задает вопрос: генерирует список того, что находится в первом списке, но не во втором.
В качестве альтернативы, в зависимости от ваших предпочтений читабельности, это делает для достойной однострочной:
Вывод:
Обратите внимание, что вы можете удалить
list(...)
вызов, если вы просто перебираете его.Поскольку это решение использует счетчики, оно правильно обрабатывает количества по сравнению со многими ответами на основе набора. Например на этот вход:
Выход:
источник
Вы можете использовать простой метод, если элементы списка рассылки отсортированы и установлены.
или с собственными методами набора:
Наивное решение: 0.0787101593292
Решение для собственного набора: 0.998837615564
источник
Я немного опоздал в игре для этого, но вы можете сравнить производительность некоторых из вышеупомянутого кода с этим, два из самых быстрых претендентов,
Я прошу прощения за элементарный уровень кодирования.
источник
Вот несколько простых, сохраняющих порядок способов отображения двух списков строк.
Код
Необычный подход с использованием
pathlib
:Это предполагает, что оба списка содержат строки с эквивалентными началами. Смотрите документы для более подробной информации. Обратите внимание, что это не особенно быстро по сравнению с операциями над множествами.
Простая реализация с использованием
itertools.zip_longest
:источник
temp1
иtemp2
линии хорошо. Если вы, например, перевернете элементы вtemp2
или вставите какое-то другое значение в началоtemp2
, listcomp просто вернет те же элементы, что и вtemp1
Это еще одно решение:
источник
Если вы сталкиваетесь,
TypeError: unhashable type: 'list'
вам нужно превратить списки или наборы в кортежи, например:Смотрите также Как сравнить список списков / наборов в python?
источник
Допустим, у нас есть два списка
Из приведенных выше двух списков видно, что пункты 1, 3, 5 существуют в списке list2, а пункты 7, 9 - нет. С другой стороны, пункты 1, 3, 5 существуют в списке 1, а пункты 2, 4 - нет.
Как лучше всего вернуть новый список, содержащий пункты 7, 9 и 2, 4?
Все ответы, приведенные выше, находят решение, а теперь самое оптимальное?
против
Используя время, мы можем увидеть результаты
возвращается
источник
однолинейная версия решения arulmr
источник
если вы хотите что-то более похожее на набор изменений ... может использовать счетчик
источник
Мы можем вычислить пересечение минус объединение списков:
источник
Это можно решить одной строкой. Вопрос задается двумя списками (temp1 и temp2), возвращающими их разницу в третьем списке (temp3).
источник
Вот простой способ различить два списка (независимо от содержимого), вы можете получить результат, как показано ниже:
Надеюсь, это будет полезно.
источник
Я предпочитаю использовать преобразование в наборы, а затем использовать функцию "разности ()". Полный код:
Вывод:
Это легче всего понять, и даже больше в будущем, если вы работаете с большими данными, преобразование их в наборы удалит дубликаты, если дубликаты не требуются. Надеюсь, поможет ;-)
источник
источник
например, если
list1 = [10, 15, 20, 25, 30, 35, 40]
иlist2 = [25, 40, 35]
тогда возвращенный список будетoutput = [10, 20, 30, 15]
источник