Python基于另一个rlist从列表中删除对象

时间:2015-12-08 08:24:41

标签: python

我有一个queryresult数据

 data = Phone_Numbers.objects.filter(phone_no__startswith=phone_prefix)

我有一个模特

class Phone_Numbers(models.Model):
    phone_no = models.CharField(max_length = 20)
    phone_no_type = models.CharField(max_length = 30,default = 'Mobile')
    phone_no_category = models.CharField(max_length = 30,default = 'Standard')  
    def __eq__(self, other):
        if self.phone_no== other.phone_no:
            return True
        else :
            return False

我有一个只有少量参数的phonenumber对象列表。 如果在查询结果数据中有一个具有相同语音的对象,则如何过滤列表

data=[{phone_no:'9882822',phone_type:'landline,phone_category:'Standard'},  {phone_no:'9882821',phone_type:'landline,phone_category:'Standard'}]

insert_list=[{phone_no:'9882822'},{phone_no:'9882821'},{phone_no:'9882825'},]

我的预期输出是insert_list = [{phone_no:' 9882825'}]

我通过以下方式获得结果是否有更好的方法来做到这一点

 newlist=insert_list[:]
    for entry in data:
                for listentry in newlist:
                    if entry==listentry:
                        insert_list.remove(entry) 

1 个答案:

答案 0 :(得分:0)

不确定您的确切问题是什么,但如果您想在python中过滤列表,则至少有两种可能的方法。第一个是使用filters,这是我的建议第一。

my_list = [{'attr': 'test'}, {'attr': 'test1'}, {'attr': 'test2'}, {'attr': 'test2'}]
my_list = filter(lambda x: x.attr is not 'test2', my_list)

这可以扩展"到

def my_filter(element):
    return element.attr is not 'test2'

my_list = [{'attr': 'test'}, {'attr': 'test1'}, {'attr': 'test2'}, {'attr': 'test2'}]

my_list = filter(my_filter, my_list)

但是,python 2python 3版本的过滤器之间存在差异。 Python 3过滤器函数从iterable的那些元素返回一个迭代器,函数返回true。在这种情况下,python 2返回一个列表,其中包含过滤函数返回true的元素。

第二个机会是使用generators,例如像

list_of_objects = [x for x in list_of_objects if x.attr is not value_to_filter]

以下是一些非常有用的examples

在你的情况下,只需使用

之类的东西
list1=[{'phone_no':928828292},{'phone_no':928828293},{'phone_no':928828294}] 
list2=[{'phone_no':928828293,type:'landline'}]

def my_filter(element):
    global list2
    for element2 in list2:
        if element['phone_no'] == element2['phone_no']:
            return False
    return True

print(filter(my_filter, list1))

如果另一个列表不能全局使用python functools

from functools import partial

list1=[{'phone_no':928828292},{'phone_no':928828293},{'phone_no':928828294}] 
list2=[{'phone_no':928828293,'type':'landline'}]

def my_filter(other_list, element):
    for element2 in other_list:
        if element['phone_no'] == element2['phone_no']:
            return False
    return True

print(filter(partial(my_filter, list2), list1))