为了账号安全,请及时绑定邮箱和手机立即绑定

选择与另一个列表相交的列表元素的简单方法?(Python)

选择与另一个列表相交的列表元素的简单方法?(Python)

慕侠2389804 2021-09-28 17:13:51
在 R 中,如果我希望所有元素x都在 中y,我会这样做x[x %in% y]在 python 中,我可以使用列表理解:[i for i in y if i in x]有没有更干净/更易读的方式?我掌握了 Python 的窍门,但我编写的代码并不像我习惯的那样易读。我尝试的第一件事没有奏效:x[x in y]我猜是因为in在 python 中只需要标量。
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

您是对的:默认情况下,Python 操作不是矢量化的。在这方面,R比常规 Python更接近于 3rd 方Pandas的 API 。所以你可以使用 Pandas 系列对象:


import pandas as pd


x = pd.Series([1, 2, 3, 4])

y = pd.Series([2, 4, 6, 8])


res = x[x.isin(y)]


print(res)  # output Pandas series

# 1    2

# 3    4

# dtype: int64


print(res.values)  # output NumPy array representation

# array([2, 4], dtype=int64)

Pandas 建立在NumPy 之上,所以你可以在 NumPy 中做同样的事情也就不足为奇了:


import numpy as np


x = np.array([1, 2, 3, 4])

y = np.array([2, 4, 6, 8])


res = x[np.isin(x, y)]


print(res)

# array([2, 4])


查看完整回答
反对 回复 2021-09-28
?
三国纷争

TA贡献1804条经验 获得超7个赞

您可以通过定义自定义getitem () 方法来创建具有您想要的行为的MyList类型


from collections import UserList, Iterable


class MyList(UserList):

    def __getitem__(self, item):

        if isinstance(item, Iterable):

            return MyList(x for x in self.data if x in item)

        return super(MyList, self).__getitem__(item)



if __name__ == '__main__':

    l = MyList([1, 2, 3, 4, 5])

    v = l[[2, 3, 11]]

    print(v)  # [2, 3]


查看完整回答
反对 回复 2021-09-28
?
翻阅古今

TA贡献1780条经验 获得超5个赞

这是使用 .isin() 方法的示例,相当于 R 的 %in%。


>> x = pd.Series([1,2,3,4,5])

>> y = pd.Series([1,3,5,6])


>> x[x.isin(y)]


0    1

2    3

4    5


查看完整回答
反对 回复 2021-09-28
  • 3 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信