【问题标题】:list of dictionaries comprehension - multiple conditions字典理解列表 - 多个条件
【发布时间】:2016-04-21 07:40:01
【问题描述】:

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

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

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

【问题讨论】:

  • 预期输出是什么?

标签: python list list-comprehension multiple-conditions


【解决方案1】:

尝试将and 更改为or

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

记住de morgan's laws。非正式地:当你否定一个布尔表达式时,除了用“!=”切换“==”之外,你还必须用or切换and

【讨论】:

  • 太棒了,这正是我想要的。基本逻辑错误,很高兴知道。非常感谢
【解决方案2】:

你的情况应该是这样的

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

这会检查当前元素的name 是否为paulcity 是否为madrid。如果两个条件都满足,外面的not会翻转,所以会得到False,该项会被省略。

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

【讨论】:

  • @causeyo 请考虑accepting an answer,让以后的读者知道问题解决了,解决方案靠谱:-)
【解决方案3】:

您可以使用itemgetter 将所有值放入tuple,然后进行比较:

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

【讨论】:

    【解决方案4】:

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

    from collections import namedtuple
    Profile = namedtuple('Profile', ['city', 'id', 'name'])
    listionary = [Profile(*d) for d in listionary]
    

    为了提高可读性,您可以将条件重构为 lambda 表达式(假设您使用的是namedtuple):

    removed = lambda ele: \
       ele.name == 'paul' or \
       ele.city == 'madrid'
    output = [ele for ele in listionary if not removed(ele)]
    

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

    【讨论】:

      猜你喜欢
      • 2020-01-08
      • 2023-02-14
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      相关资源
      最近更新 更多