python设置与对象集的交集

Kev*_*oer 5 python intersection set amazon-ec2 boto

我正在与亚马逊博托合作,我有2个名单.列表1包含实例对象.列表2包含InstanceInfo对象.两个对象都有一个名为id的属性.我需要获取InstanceInfo列表中存在id的Instance对象列表.

l1 = [Instance:i-04072534, Instance:i-06072536, Instance:i-08072538, Instance:i-0a07253a, Instance:i-e68fa1d6, Instance:i-e88fa1d8, Instance:i-ea8fa1da, Instance:i-ec8fa1dc]

l2 = [InstanceInfo:i-ec8fa1dc, InstanceInfo:i-ea8fa1da, InstanceInfo:i-e88fa1d8, InstanceInfo:i-e68fa1d6]
Run Code Online (Sandbox Code Playgroud)

通缉结果:

l3 = [Instance:i-ec8fa1dc, Instance:i-ea8fa1da, Instance:i-e88fa1d8, Instance:i-e68fa1d6]
Run Code Online (Sandbox Code Playgroud)

现在我有它通过:

l3= []
for a in l1  
    for b in l2:
        if a.id == b.id:
            l3.append(a)
Run Code Online (Sandbox Code Playgroud)

但是,有人告诉我,我应该使用set intersection替换它.我一直在看例子,看起来很简单.但我没有看到任何使用对象的示例.

我已经玩了一段时间,理论上我可以看到它的工作,但可能有一些我可能不知道的'高级'语法.我还在学习python.

Eri*_*got 8

这是比Marcin的答案更快的东西(虽然相似):

ids_l1 = set(x.id for x in l1)  # All ids in list 1
intersection = [item for item in l2 if item.id in ids_l1]  # Only those elements of l2 with an id in l1
Run Code Online (Sandbox Code Playgroud)

重要的是预先计算ids_l1和不写入if item.id in set(…),因为每次都要重建该集合(因为对每个元素重新评估完整的测试表达式item).

Python集为您提供快速元素成员资格测试(in).使用集合比使用列表要快得多(因为列表的元素必须逐个读取,而集合的元素是"散列").