Python运算符类似于R中的%in%

时间:2015-06-18 05:53:37

标签: python r

我在R

中寻找类似于%in%的运营商

例如,

x = c("a","b","c"); 
y = c("a","d")

x %in% y # would give me
#TRUE FALSE FALSE

如何在Python中实现这一目标?

4 个答案:

答案 0 :(得分:1)

>>> x = ("a", "b", "c")
>>> y = ("a", "d")
>>> map(y.__contains__, x)
[True, False, False]

如果 y 存储在 set 中,则可以加速包含测试,因为O(1)哈希表查找可以避免不必要的比较:

>>> y = {"a", "d"}
不要被其他受访者的虚假时间所欺骗。对于非平凡的数据集,重复的O(n)搜索是一个糟糕的想法。时间也被错误解释(在两项搜索空间中仅测试了三个输入, map set 的一次性全局变量查找的成本趋势主导时间)。此外,另一位受访者忽略了计时工具发出的警告,这些警告表明他的时间非常不一致(可能是由于缓存的中间结果使得时间无用)。

我认为,如果您正在进行 R 式统计分析,那么您的数据会大于A B CA 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

答案 1 :(得分:1)

我会使用Python数据分析库“pandas”来处理需要类似于R的操作的东西。您可以在这里开始:http://pandas.pydata.org/。使用pandas的%in%%的python将是“isin”(这里有例子:http://pandas.pydata.org/pandas-docs/stable/comparison_with_r.html#match

答案 2 :(得分:0)

这会给你一个布尔数组。

numpy.x([1,1,1]) == numpy.y([1,1,1])

答案 3 :(得分:0)

Python不附带一个完全符合您要求的运算符。一种选择是调整你的代码来做" pythonic"办法。另一个选择是使用运算符重载为特定类创建自定义运算符。

选项1可能是最好的选择:它更直接,您的代码更易于阅读和修改。选项2(在我看来)更有趣,但是如果您正在制作特定于域的语言或在您完全控制的小代码库中工作,则可能只有意义。

Koba提供了几种选择。我个人的意见是只使用列表推导而不是map:Python 3有map返回迭代器而不是列表,并且有一些历史记录,人们发现列表推导更具可读性(以及Python的终身仁慈独裁者,Guido,更喜欢列表理解到地图)。因此,我认为这是选项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]