词典理解列表 - 多个条件

时间:2016-01-15 16:33:37

标签: 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'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'}]

我想删除符合这两个条件的元素。

4 个答案:

答案 0 :(得分:5)

尝试将<a href="#" onclick="delayUrlLoad('http://www.google.com/', 10000);return false;"> Click Here </a> 更改为and

or

记住de morgan's laws。非正式地:当你否定一个布尔表达式时,除了用“!=”切换“==”之外,你还必须用[elem for elem in listionary if (elem.get('name')!='paul' or elem.get('city')!='madrid')] 切换and

答案 1 :(得分:5)

你的情况应该是这样的

[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'}]

这会检查当前元素的namepaul还是citymadrid。如果两个条件都满足,not外部将翻转它,因此您将获得False并且该项目将被省略。

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

答案 2 :(得分:2)

您可以使用itemgetter将所有值转换为Departure City,然后对其进行比较:

tuple

答案 3 :(得分:1)

您的数据实际上是非常静态的。在这种情况下,您可以使用>>> from operator import itemgetter >>> name_and_city = itemgetter('name', 'city') >>> [e for e in listionary if name_and_city(e) != ('paul', 'madrid')] 来获取大数据的效果。

namedtuple

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

namedtuple

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