如何查找列表中的对象,但不是在另一个列表中,按属性进行比较。在python2中

时间:2016-05-12 15:53:58

标签: python list list-comprehension

我在python2中有2个对象列表。它们属于不同类型但具有共同属性(' name')。我控制一个列表(my_list),另一个列表发送给我(src_list)。

我想在src_list中找到 new 对象,这些对象不在my_list中,通过比较他们的姓名'属性。

伪代码(以及我在C中如何做到这一点)如下所示,但是在我采用python方法之后,我可能会列出理解和内容,但我无法理解它进行。

new_list = []
for srco in src_list: # iterate everything in src list
    found = False
    for myo in my_list: # iterate everything in my list
        if(srco.name.lower() == myo.name.lower()): # compare names, break if true
            found = True
            break
    if not found: # add to new list if wasn't found
        new_list.append(srco)

4 个答案:

答案 0 :(得分:1)

使用集合进行快速查找。

Short types = new Short();

另外,如果你想学习更多pythonic,不要做public ActionResult Index() { AllDBModels allModels = new AllDBModels(); allModels.AllGraphs = new Graph(); allModels.AllGraphs.Charts = new List<Highcharts>(); ChartsModel model = new ChartsModel(); model.Charts = new List<Highcharts>(); ViewBag.Rooms = db.namtar_studyrooms.ToList() //the collection here (you should changeit, just an example) } 模式。这样做:

 @Html.DropDownListFor(model => model.reports.RoomNumber, new SelectList(ViewBag.Rooms, "RoomID", "RoomNameForDisplay"), "Select Room for default", new { @class = "form-control" })

答案 1 :(得分:1)

一种简单的方法是首先生成要从index.search('john', function searchDone(err, content) { $scope.users.push(content.hits); console.log(content.hits); $scope.$apply(); }); 中排除的名称集,然后迭代span>strong以保留无法从集合中找到的项目:

< span > < strong > < / strong > < / span >

答案 2 :(得分:1)

你可以使用套装来做到这一点。 创建一个包含my_list名称的集合,另一个包含src_list的集合并简单地减去这两个:

diff_set = src_list_set - my_list_set

然后您可以获取名称显示在diff_set

中的对象
my_list_set = {obj.name.lower() for obj in my_list}
src_list_set = {obj.name.lower() for obj in src_list}
diff_set = src_list_set - my_list_set
new_list = [obj for obj in src_list if obj.name.lower() in diff_set]

(解决方案可能不是特别短,但通过您可以找到on the official doc的其他操作替换减号,它可以在很多其他情况下以最低成本完成)

答案 3 :(得分:1)

是的,就像你已经说过的那样,列表理解会浮现在脑海中。然后,map内置函数可用于为其中一个列表中的名称创建迭代器。

result = [obj for obj in srco if obj.name.lower() not in set(map(lambda x: x.name.lower(), myo))]