2017-04-20 66 views
2

我一直在阅读一些其他的SO文章,并了解我想要完成的东西的零碎,但我还没有解决包含我的答案要求。Python - 从列表中删除键/值元素并返回新列表

我知道如何从像[1,2,3,4]这样的简单列表中删除单个项目,但我有一个更复杂的列表,其中的命令/内容不可预测,我试图删除

list = [{u'role': u'OWNER', u'userByEmail': u'[email protected]'}, {u'specialGroup': u'projectWriters', u'role': u'READER'}, {u'specialGroup': u'projectOwners', u'role': u'READER'}, {u'specialGroup': u'projectReaders', u'role': u'READER'}, {u'role': u'READER', u'userByEmail': u'[email protected]'}, {u'view': {u'projectId': u'project-01', u'tableId': u'testing_tbl_2', u'datasetId': u'test2'}}, {u'view': {u'projectId': u'project-01', u'tableId': u'testing_tbl_3', u'datasetId': u'dtest2'}}, {u'view': {u'projectId': u'project-01', u'tableId': u'view1', u'datasetId': u'test2'}}] 

我需要删除:从一个元素

{u'role': u'READER', u'userByEmail': u'[email protected]'} 

,并返回新的列表,而该键/值元素存在。我可以做这样的事情(我更喜欢这种格式),但这只会返回过滤器正在查找的键/值元素。

>>> filter(lambda row: row.has_key('userByEmail') and row['userByEmail'] == '[email protected]', list) 
[{u'role': u'OWNER', u'userByEmail': u'[email protected]'}] 

如何从列表中删除元素,然后打印出缺少过滤元素的新列表?

+0

所以,你应该使用'lambda'来完成相反的过滤。 – ForceBru

+0

你给过滤器的谓词决定*要保留什么*。只是否定它... –

回答

3

反转的条件

not (...) 

所以

filter(lambda row: row.has_key('userByEmail') and row['userByEmail'] == '[email protected]', list) 

成为

filter(lambda row: not (row.has_key('userByEmail') and row['userByEmail'] == '[email protected]'), list) 
+0

哇,我不能相信我错过了那个哈哈谢谢。 – user3282173

0

我不知道,但也许有next()

list.remove(next(obj for obj in list if obj == {u'role': u'READER', u'userByEmail': u'[email protected]'}))