我有一个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)
答案 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 2和python 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))