python通过检查另一个lis中的键来获取元素

2024-03-29 02:34:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从一个列表中得到一个子集,通过检查它的键是否在另一个列表中。你知道吗

class object:
    def __init__(self, key, x, y):
        self.key = key
        self.x = x
        self.y = y

o1 = object(key=300, x=18.0, y=100.0)
o2 = object(key=301, x=12.0, y=1032.0)

x1 = object(key=100, x=28.0, y=2300.0)
x2 = object(key=101, x=43.0, y=332.0)
...


myobj = [o1, o2, o3]
objects = [x1, x2, x3, x4, x5, x6, ... ]

假设o2.key == x3.keyo3.key == x6.key,则得到[o2, o3]

有没有简单的方法?你知道吗


Tags: keyself列表objectinitdef子集class
3条回答

你可以使用列表理解来得到结果

result = [filter(lambda y: y.key == x.key, myobj) for x in objects]

编辑:

这将返回一个list列表,它不是所需的anwser操作,它需要一个额外的reduce来确定结果

def intersect():
    o1 = {"key":300, "x":18.0, "y":100.0}
    o2 = {"key":500, "x":18.0, "y":100.0}
    o3 = {"key":600, "x":18.0, "y":100.0}

    x1 = {"key":300, "x":18.0, "y":100.0}
    x2 = {"key":300, "x":18.0, "y":100.0}

    myobj = [o1, o2, o3]
    objects = [x1, x2]

    result = reduce(lambda x,y: x+y, [filter(lambda y: y['key'] == x['key'], myobj) for x in objects])
    print result

您可以使用表格的列表:

keys = [ x.key for x in objects ]
subset = [ x for x in myobj if x.key in keys ]

尽管您最好将数据调整到字典中,因为查找在更大的数据集上执行得更好。你知道吗

你能给对象类型添加^{}__eq__()方法吗?如果是这样,可以直接使用集合:

set(myobj).intersection(objects)

即使不能使用__hash__(),也可以使用以下键:

subset_keys = set(o.key for o in myobj).intersection(o.key for o in objects)
subset = [ o for o in objects if o.key in subset_keys ]

更新:根据更新的问题。。。你知道吗

class object:
    def __init__(self, key, x, y):
        self.key = key
        self.x = x
        self.y = y

    def __hash__(self):
        # must return an int
        return self.key
    def __eq__(self, other):
        return hash(self) == hash(other)

相关问题 更多 >