第一个列表中的每个对象根据属性值相等的条件与第二个列表中的对象匹配

问题描述 投票:0回答:1

想象我们的房屋数量有限。每个房子都有一个号码。每栋房子住一男一女。

我们为代表人士开设以下课程:

class Person:
    def __init__(self, name, age, house_number):
        self.name = name
        self.age = age
        self.house_number = house_number

我们有两个包含此类对象的列表,称为

men
women
。为了理解列表的结构,下面是向列表添加对象的示例。

men.append(Person("Alex", 22, 71))

认为列表已经填充了对象。因此,我们的

men
列表中包含所有男性,
women
列表中包含所有女性。由于房屋数量有限,并且每栋房屋都有一男一女,因此列表的长度是相等的。两个列表中的对象都是随机的。

假设数据量非常大。

问题的目标是在

min_age
列表中找到所有超过一定年龄(变量
men
)的男性,并将他们每个人与
women
列表中与他住在同一所房子里的女性相匹配.

找到的所有男性必须在

men_new
列表中,女性必须在
women_new
列表中。这些列表必须具有可比性,因此住在同一所房子里的男性和女性在
men_new
women_new
列表中必须具有相同的索引。

我现在有以下解决方案:

# We believe that lists "men", "women" and variable "min_age" are previously defined.

men_new = []
women_new = []

for man in men:
    if man.age > min_age:
        men_new.append(man)

for man in men_new:
    women_new.append(filter(lambda x: x.house_number == man.house_number, women)

这个解决方案效果很好,但是处理大量数据时速度非常慢。有什么方法可以更快地解决这个问题吗?预先感谢!

python arrays algorithm bigdata data-analysis
1个回答
0
投票

将您的女性列表转换为将门牌号映射到女性的字典:

house_to_woman = {}
for w in women:
    house_to_woman[w.house_number] = w

然后您可以使用此映射使代码的最后一行变得高效:

for m in men_new:
    women_new.append(house_to_woman[m.house_number])
© www.soinside.com 2019 - 2024. All rights reserved.