Операция вычитания списка Python
Но это не поддерживается списками python Каков наилучший способ сделать это?
9 ответов
Используйте понимание списка:
Если вы хотите использовать синтаксис — infix, вы можете просто сделать:
вы можете использовать его, как:
Но если вам не нужны свойства списка (например, упорядочение), просто используйте наборы, как рекомендуют другие ответы.
Или вы можете просто установить x и y, чтобы вам не приходилось делать никаких преобразований.
Это операция «вычитания множества». Используйте для этого структуру данных.
Если проблемы с дублированием и упорядочением являются проблемой:
[i for i in a if not i in b or b.remove(i)]
Для многих случаев использования ответ, который вы хотите:
версия aaronasterling выполняет len(y) сравнение элементов для каждого элемента в x , поэтому требуется квадратичное время. Версия quantSoup использует наборы, поэтому для каждого элемента в x используется только один постоянный поиск по времени, но поскольку он преобразует как x , так и y в множества, он теряет порядок ваших элементов.
Преобразуя только y в набор и итерируя x по порядку, вы получаете лучшее из как линейного времени мира, так и сохранения порядка. *
Тем не менее, эта проблема по-прежнему имеет проблему с версией quantSoup: она требует, чтобы ваши элементы были хешируемыми. Это в значительной степени встроено в природу наборов. ** Если вы пытаетесь, например, вычесть список dicts из другого списка dicts, но список для вычитания большой, что вы делаете?
Если вы можете украсить свои ценности каким-то образом, что они хешируются, это решает проблему. Например, с плоским словарем, значения которого сами хешируются:
Если ваши типы немного сложнее (например, часто вы имеете дело с JSON-совместимыми значениями, которые являются хешируемыми или списками или dicts, значения которых рекурсивно одного типа), вы все равно можете использовать это решение. Но некоторые типы просто не могут быть преобразованы во что-нибудь хешируемое.
Если ваши элементы не являются и не могут быть сделаны хешируемыми, но они сопоставимы, вы можете, по крайней мере, получить лог-линейное время ( O(N*log M) , что намного лучше, чем время O(N*M) решение списка, но не так хорошо, как время O(N+M) заданного решения) путем сортировки и использования bisect :
Если ваши элементы не являются ни хешируемыми, ни сопоставимыми, вы зацикливаетесь на квадратичном решении.
* Обратите внимание, что вы также можете сделать это, используя пару объектов OrderedSet , для которых вы можете найти рецепты и сторонние модули. Но я думаю, что это проще.
** По умолчанию набор запросов — это постоянное время, так как все, что ему нужно сделать, это хэш-значение и посмотреть, есть ли запись для этого хэша. Если он не может присвоить значение, это не сработает.
Вычитание 2 списков в Python
Если ни один из них не определяет эти операнды для этих типов, могу ли я определить его вместо этого?
Если нет, следует ли мне создать новый класс vector3?
задан 10 фев ’09, 21:02
13 ответы
Если это то, что вы в конечном итоге делаете часто и с разными операциями, вам, вероятно, следует создать класс для обработки таких случаев или лучше использовать какую-нибудь библиотеку, например Numpy.
В противном случае ищите список понимания используется с застежка-молния встроенная функция:
ответ дан 28 мая ’14, 21:05
Вот альтернатива составлению списков. Map выполняет итерацию по списку (спискам) (последние аргументы), делая это одновременно, и передает их элементы в качестве аргументов функции (первый аргумент). Возвращает результирующий список.
Этот код имеет меньший синтаксис (который для меня более эстетичен) и, по-видимому, на 40% быстрее для списков длиной 5 (см. Комментарий bobince). Тем не менее, любое решение будет работать.
Я обычно вижу, что понимание списков рекомендуется вместо map (), хотя это может быть просто потому, что это более чистый код . не уверен в разнице в производительности, если таковая имеется. — Дэвид З
Map () у меня получается почти на 40% быстрее на Py2.6 для пятиэлементного вычитания. Понимания новее и чище там, где они избегают лямбда, но для отображения существующих функций карта все еще может быть красивой . особенно здесь, где вы можете использовать встроенный zip. — бобинс
это также работает для array.array (хотя результатом является список) — род
необходимо условие «оператор импорта»; int .__ sub__ работает лучше)) — Гарей
Операция вычитания списка Python
но это не поддерживается списками python
Каков наилучший способ сделать это?
10 ответов:
использовать список понимание:
если вы хотите использовать — синтаксис инфикса, вы можете просто сделать:
затем вы можете использовать его как:
но если вам абсолютно не нужны свойства списка (например, порядок), просто используйте наборы, как рекомендуют другие ответы.
использовать установить разницу
или у вас могут быть только X и y, поэтому вам не нужно делать никаких преобразований.
это операция» set subtraction». Используйте для этого заданную структуру данных.
В Python 2.7:
выход:
Если дублировать и заказывать детали проблема:
[i for i in a if not i in b or b.remove(i)]
для многих случаев использования, ответ вы хотите:
это гибрид между aaronasterling это и ответ quantumSoup.
версия aaronasterling делает len(y) сравнение элементов для каждого элемента в x , так что это занимает квадратичное время. версия quantumSoup использует наборы, поэтому она выполняет один поиск набора констант для каждого элемента в x -но, потому что он преобразует и x и y в наборы, он теряет порядок ваших элементов.
путем преобразования только y в набор, и перебор x для того, чтобы вы получили лучшее из обоих миров-линейное время и сохранение порядка.*
однако у этого все еще есть проблема с версией quantumSoup: она требует, чтобы ваши элементы были хэшируемыми. Это в значительной степени встроено в природу наборов.** Если вы пытаетесь, например, вычесть список диктов из другого списка диктов, но список чтобы вычесть большой, что вы делаете?
если вы можете украсить ваши ценности в некотором роде, что они hashable, что решает проблему. Например, с плоским словарем, значения которого сами хешируются:
если видов немного более сложных (например, часто вы имеете дело с JSON-совместимые значения, которые hashable, или списки или словарь, значения которых являются рекурсивно тот же тип), вы все еще можете использовать это решение. Но некоторые типы просто не могут быть преобразуется во что-нибудь хэшируемое.
если ваши элементы не, и не может быть сделано, hashable, но они сопоставимы, можно как минимум получить лог-линейного времени ( O(N*log M) , что намного лучше, чем O(N*M) время решения списка, но не так хорошо, как O(N+M) время заданного решения) путем сортировки и использования bisect :
если ваши товары не hashable, ни сравнима, то вы застряли с квадратичной решение.
* обратите внимание, что вы также можете сделать это с помощью пары OrderedSet объекты, для которых можно найти рецепты и сторонних модулей. Но я думаю, что это проще.
** причина, по которой поиск настроек является постоянным временем, заключается в том, что все, что ему нужно сделать, это хэшировать значение и посмотреть, есть ли запись для этого хэша. Если он не может хэшировать значение, это не будет работать.
Оператор вычитания Python
Python предоставляет оператор вычитания – вычесть один объект от другого. Семантика вычитания зависит от типов данных операндов. Например, вычитание двух целых чисел выполняет операцию арифметической разности, тогда как вычитание двух наборов выполняет операцию набора разности. Конкретное возвращаемое значение оператора минус определяется в данных … Оператор вычитания Python Подробнее »
- Автор записи
Автор оригинала: Chris.
Python предоставляет оператор вычитания — вычесть один объект из другого. Семантика вычитания зависит от типов данных операндов. Например, вычитание двух целых чисел выполняет Арифметическая разница Операция, тогда как вычитание двух наборов выполняет Установить разницу операция. Конкретное возвращаемое значение оператора минус определяется в типах данных « __sub __ () магический метод.
Посмотрите на следующие примеры!
Примеры
Оператор на целочисленных операндах дает еще одно целое – математическое Разница обоих операндов:
Если хотя бы один из операндов – это значение поплавка, результат также является поплавком, является инфекционным!
Вы также можете выполнить оператор вычитания на Python наборы Отказ В этом случае он рассчитывает Установить разницу , то есть, он создает новый набор элементов в первом, но не во втором операнде.
Что если два операнда имеют несовместимый тип данных? Например, если вы попытаетесь вычесть набор из строки?
Результат несовместимого добавления является Типеррор Отказ Вы можете исправить его, используя только совместимые типы данных для операции.
Можете ли вы использовать оператор вычитания на пользовательских объектах? Да!
Магический метод вычитания Python
Чтобы использовать оператор вычитания на пользовательских объектах, определите __sub __ () Дундер Метод, который занимает два аргумента: Я и Другое и возвращает результат Я — другие Отказ Вы можете определить конкретное поведение, используя атрибуты (данные), поддерживаемые в этом объекте.
В следующем коде вы создаете корзину из <«Кофе», «Банан», «Хлеб»>Но затем вы удалите содержимое в другой корзине <«CRED»>Из него – например, чтобы предотвратить двойную покупку:
Выход этого фрагмента кода является новой корзиной:
Код состоит из следующих шагов:
- Создать класс Корзина Это содержит содержимое списка для хранения некоторых товаров.
- Определите магический метод __sub__ Это создает новую корзину, сочетая наборы товаров от корзин двух операндов. Обратите внимание, что мы полагаемся на уже реализованный оператор вычитания на множествах, то есть Установить разницу , чтобы на самом деле реализовать оператор вычитания для корзин.
- Мы создаем две корзины My_Basket и to_remove и рассчитайте разницу между ними к новой корзине updated_basket Отказ
Вы можете вычесть списки в Python?
Python не позволяет встроенную поддержку для Разница в списке Операция , то есть, создавая новый список с элементами из первого списка операнда Но без элементов из второго списка операнда. Вместо этого, чтобы вычесть lst_2 из списка lst_1 Используйте оператор понимания списка как фильтр [x для x в lst_1, если x не в lst_2] Отказ
Вот пример кода:
Этот код использует понимание списка, который является компактным способом создания списков. Простая формула – [Выражение + контекст] Отказ
- Выражение: Что делать с каждым элементом списка?
- Контекст: Какие элементы для выбора? Контекст состоит из произвольного количества для и Если заявления.
Вы можете узнать больше о понимании списка в этом углубленном уроке с видео:
*** Список понимания – Ultimate Guide ***
Но прежде чем мы будем двигаться дальше, я рад представить вам мою новую книгу Python Python One-listers (Amazon Link).
Если вам нравятся одноклассники, вы будете любить книгу. Это научит вам все, что нужно знать о Одно строка кода Python. Но это тоже Введение в компьютерную науку , наука о данных, машин обучения и алгоритмы. Вселенная в одной строке Python!
Книга была выпущена в 2020 году с помощью книги по программированию мирового класса Nostarch Press (San Francisco).
Программа вычитания Python с пользовательским входом
Чтобы создать простую программу вычитания в Python, принимая ввод пользователя и вычитание предоставленных номеров, вы можете использовать следующие четыре шага:
- Получите ввод пользователя в виде строки с помощью встроенного вход () Функция и хранить результат в переменных num_1 и num_2 Отказ
- Преобразовать входы пользователей строки к численным типам, используя, например, int () или поплавок () конструкторы.
- Вычте численные значения с использованием оператора вычитания num_1 — num_2 Отказ
- Распечатайте результат к оболочке Python.
Вот эти четыре шага в Python код:
Вот пример выполнения кода, где я помещаю в целые числа 44 и 2, и рассчитал разницу с использованием оператора вычитания:
Сторирование оператора вычитания Python
Вы можете объединить два оператора вычитания. Например, выражение X – Y – Z сначала рассчитал разницу между х и y а затем вычесть z из полученного объекта. Таким образом, это семантически идентично ( (X – Y) – Z) Отказ
Вот минимальный пример:
Арифметические операторы
Арифметические операторы – синтаксические ярлыки для выполнения основных математических операций по номерам.
| Оператор | Имя | Описание | Пример |
| + | Добавление | Расчет суммы двух операндов | 3 + 4 |
| – | Вычитание | Вычитание второго операнда с первого операнда | 4 – 3 |
| * | Умножение | Умножить первый со вторым операндом | 3 * 4 |
| / | Разделение | Разделение первого на второй операнд | 3 / 4.75 |
| % | Модуль | Расчет остатка при делите первого на второй операнд | 7 % 4 |
| // | Целочисленное разделение, напольное разделение | Разделение первого операнда на второй операнд и закругление результата до следующего целого числа | 8 // 3 |
| ** | Экспонент | Поднимая первый операнд на силу второго операнда | 2 ** 3 |
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.