Python 词典列表-多个条件

Python 词典列表-多个条件,python,list,list-comprehension,multiple-conditions,Python,List,List Comprehension,Multiple Conditions,我对列表中的多个条件有问题: listionary = [{u'city': u'paris', u'id': u'1', u'name': u'paul'}, {u'city': u'madrid', u'id': u'2', u'name': u'paul'}, {u'city': u'berlin', u'id': u'3', u'name': u'tom'}, {u'city': u'madrid', u

我对列表中的多个条件有问题:

listionary = [{u'city': u'paris', u'id': u'1', u'name': u'paul'},
              {u'city': u'madrid', u'id': u'2', u'name': u'paul'},
              {u'city': u'berlin', u'id': u'3', u'name': u'tom'},
              {u'city': u'madrid', u'id': u'4', u'name': u'tom'}]
我尝试删除同时满足这两个条件的项目

[elem for elem in listionary if (elem.get('name')!='paul' and elem.get('city')!='madrid')]
在这种情况下,如果元素至少满足一个条件,则会被删除,我尝试用几种方法来实现它,有什么想法吗

预期产出:

[{u'city': u'paris', u'id': u'1', u'name': u'paul'}
{u'city': u'berlin', u'id': u'3', u'name': u'tom'}
{u'city': u'madrid', u'id': u'4', u'name': u'tom'}]

我想删除同时满足这两个条件的元素。

尝试将
更改为

[elem for elem in listionary if (elem.get('name')!='paul' or elem.get('city')!='madrid')]

记住。非正式地说:当你否定一个布尔表达式时,除了用“!=”来切换“==”之外,你还必须用“!=”来切换
,你的条件应该是这样的

[e for e in data if not (e.get('name') == 'paul' and e.get('city') == 'madrid')]
输出

[{u'city': u'paris', u'id': u'1', u'name': u'paul'},
 {u'city': u'berlin', u'id': u'3', u'name': u'tom'},
 {u'city': u'madrid', u'id': u'4', u'name': u'tom'}]
这将检查当前元素的
名称
是否为
paul
city
是否为
madrid
。如果两个条件都满足,则
not
外部将翻转它,因此您将得到
False
,并且该项将被忽略

基本上,您正在检查当前项是否是您不想要的项,如果是,则使
条件失败。

您可以使用将所有值放入
元组中,然后比较:

>>> from operator import itemgetter
>>> name_and_city = itemgetter('name', 'city')
>>> [e for e in listionary if name_and_city(e) != ('paul', 'madrid')]

您的数据实际上是相当静态的。在这种情况下,您可以使用
namedtuple
来提高大数据的性能

from collections import namedtuple
Profile = namedtuple('Profile', ['city', 'id', 'name'])
listionary = [Profile(*d) for d in listionary]
为了提高可读性,可以将条件重构为lambda表达式(假设您使用的是
namedtuple
):


我认为这更易于维护,更具可读性,但这可能取决于谁在查看它。

预期的输出是什么?太好了,这正是我要找的。基本的逻辑错误,很好知道。谢谢lot@causeyo请考虑,以便未来读者知道问题得到解决,解决方案是可靠的:
removed = lambda ele: \
   ele.name == 'paul' or \
   ele.city == 'madrid'
output = [ele for ele in listionary if not removed(ele)]