2017-04-20 91 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]'}))