Я ищу оператора аналогично %in%
в Rоператор Python похож на% в% в R
Например,
x = c("a","b","c");
y = c("a","d")
x %in% y # would give me
#TRUE FALSE FALSE
Как добиться этого в Python?
Я ищу оператора аналогично %in%
в Rоператор Python похож на% в% в R
Например,
x = c("a","b","c");
y = c("a","d")
x %in% y # would give me
#TRUE FALSE FALSE
Как добиться этого в Python?
Это даст вам булевский массив.
numpy.x([1,1,1]) == numpy.y([1,1,1])
Поскольку мой предыдущий комментарий удален, этот код неверен. Пожалуйста, напишите какой-нибудь реальный код. – juanchopanza
>>> x = ("a", "b", "c")
>>> y = ("a", "d")
>>> map(y.__contains__, x)
[True, False, False]
класс содержит тест может быть ускорен вверх, если у хранитс установить потому, что O (1) используют хэш-таблицы избежать ненужных сравнений:
>>> y = {"a", "d"}
Не обманывайте фиктивные тайминги от другого респондента. Для нетривиальных наборов данных повторные поиски O (n) - ужасная идея. Тайминги также были неправильно интерпретированы (при тестировании только трех входов на двухпозиционное пространство поиска стоимость одноразовых глобальных поисков переменных для map и имеет тенденцию доминировать во времени). Кроме того, другой ответчик проигнорировал предупреждения, выпущенные инструментом синхронизации, которые показывают, что его тайминги дико непоследовательны (возможно, из-за промежуточных результатов кэширования, при которых тайминги бесполезны).
Я полагаю, что если вы делаете R стиль статистический анализ, ваши данные больше, чем A B C
и A D
. Другой ответ настроен на этот набор данных игрушек и не масштабируется ни в чем, что вам может быть интересно.
In [1]: import random
In [2]: people = [random.choice(['man', 'woman', 'boy', 'girl']) for i in range(1000)]
In [3]: children = ['boy', 'girl']
In [4]: %timeit [p in children for p in people]
10000 loops, best of 3: 65 µs per loop
In [5]: %timeit map(children.__contains__, people)
10000 loops, best of 3: 58.5 µs per loop
In [6]: %timeit map(set(children).__contains__, people)
10000 loops, best of 3: 49.8 µs per loop
Поскольку пространство поиска становится больше, чем просто два выбора, разница между O (1) и O (N) поиска становится все более важным:
In [10]: scores = [random.choice(range(10)) for i in range(1000)]
In [11]: evens = [0, 2, 4, 6, 8]
In [12]: %timeit [x in evens for x in scores]
10000 loops, best of 3: 98.2 µs per loop
In [13]: %timeit map(evens.__contains__, scores)
10000 loops, best of 3: 90.5 µs per loop
In [14]: %timeit map(set(evens).__contains__, scores)
10000 loops, best of 3: 57.6 µs per loop
Просто любопытно: вы приурочили его? Для такого небольшого количества элементов мне интересно, стоит ли создавать экземпляры набора. Я вижу, что это может иметь смысл для больших чисел. – juanchopanza
Например, на моей платформе это решение занимает примерно в два раза больше, чем простое понимание списка. – juanchopanza
Я хотел бы использовать Библиотека анализа данных Python «pandas» для такого рода материалов, которая требует операций, аналогичных R. Вы можете начать работу здесь: http://pandas.pydata.org/. Эквивалент python для% in% с использованием pandas будет «isin» (здесь есть примеры: http://pandas.pydata.org/pandas-docs/stable/comparison_with_r.html#match)
Не могли бы вы подробнее рассказать о своем решении, добавив немного подробного описания вашего решения? – abarisone
Спасибо большое! «isin» - это именно то, что я ищу –
Python не поставляется с оператором, который делает именно то, что вы хотите. Один из вариантов заключается в том, чтобы адаптировать ваш код, чтобы сделать что-то «питоническим» способом. Другой вариант - использовать перегрузку оператора для создания пользовательского оператора для определенного класса.
Вариант 1, вероятно, лучше всего сделать: это более просто, и ваш код будет легче читать и модифицировать. Вариант 2 (на мой взгляд) более увлекателен, но, вероятно, имеет смысл только в том случае, если вы создаете язык, специфичный для домена, или работаете на небольшой базе кода, которую вы полностью контролируете.
Koba предлагает несколько вариантов. Мое личное мнение состоит в том, чтобы просто использовать понимание списка, а не map
: Python 3 имеет map
возвращает итератор в противоположность списку, и есть некоторая история с людьми, которые находят список понятий более читабельными (и доброжелательный диктатор Питона на всю жизнь, Гвидо, предпочитает список понимание карт).Таким образом, я думаю, что это лучший вариант 1:
people = ['man', 'woman', 'boy', 'girl']
children = ['boy', 'girl']
output = [p in children for p in people]
Вариант 2 будет работать путем создания пользовательского объекта, возможно, тот, который расширяет список или другой итерацию. Он переопределит специальный метод (так работают операторы на Python).
In [1]: class mylist(list):
...: def __mod__(self, other):
...: return [s in other for s in self]
...:
In [2]: people = mylist(['man', 'woman', 'boy', 'girl'])
In [3]: children = ['boy', 'girl']
In [4]: people % children
Out[4]: [False, False, True, True]
Хотите ли вы итерировать значения в X и проверить, существуют ли они в y? – user3636636