2016-03-01 55 views
4

我試圖從大字典中刪除所有值'x'並且不刪除任何密鑰,但是當我運行代碼時,仍有'x'值剩餘。從[list] dictionary中刪除多個值python

這裏是我的字典的摘錄:

myDict = {0: ['id1', 'id2', 'id3'], 1: ['id1', 'id2', 'x', 'x'], 2: ['id1', 'x', 'x', 'x']} 

我的代碼迄今:

for k, v in myDict.iteritems(): 
if v == 'x': 
    myDict.remove('x') 
print myDict 

什麼我的目標爲:

myDict = {0: ['id1', 'id2', 'id3'], 1: ['id1', 'id2'], 2: ['id1']} 

我應該如何去除'x'請列表中的值?

回答

4

如下您可以字典解析中使用列表理解:

myDict = {k:[el for el in v if el != 'x'] for k, v in myDict.items()} 
print(myDict) 

輸出

{0: ['id1', 'id2', 'id3'], 1: ['id1', 'id2'], 2: ['id1']} 
+0

謝謝,這工作完美! – imasnake

2

只是這樣做:

for key in myDict: 
    while 'x' in myDict[key]: 
     myDict[key].remove('x') 

,因爲你是在使用字典.remove(),而不是裏面的名單此致不起作用。你需要我使用的while循環,因爲.remove()只刪除第一個循環。因此,我只是繼續刪除第一個,直到沒有剩下的。

+0

請注意myDict [key]'和myDict [key] .remove('x')中的''x'都是O(n)運算。由於OP說他的字典很大,這個解決方案可能太複雜O(nmk)。 – timgeb

+0

這些是'O(n)'操作,但OP表示*字典*很大,不一定是用作值的列表。 – dwanderson

1

對於python2只是做:

for k, v in myDict.iteritems(): 
    if v == 'x': 
     myDict[k].remove('x') 

問題是你從字典中稱爲remove方法替代字典元素(myDict [k]]

我認爲你使用iteritems()後就是Python2。對於python 3,你可以使用不能用於第二版的字典解析。

2

有一個在你的代碼一對夫婦的缺陷:

  1. 你在字典本身調用remove,而不是它的值的列表。

  2. 字典沒有屬性remove

  3. v == 'x'檢查的任何值是否等於'x',這是從來沒有True,因爲所有的值列表,這可能會或可能不會包含'x'

  4. 即使在列表本身上調用remove也只會刪除第一個出現的'x'

最簡單的方法是建立一個新的字典:

>>> {k:[x for x in v if x!='x'] for k,v in myDict.iteritems()} 
{0: ['id1', 'id2', 'id3'], 1: ['id1', 'id2'], 2: ['id1']} 

你也可以修改你的字典到位,只是設置的值,以新的清單:

>>> for k,v in myDict.iteritems(): 
...  myDict[k] = [x for x in v if x!='x'] 
... 
>>> myDict 
{0: ['id1', 'id2', 'id3'], 1: ['id1', 'id2'], 2: ['id1']} 

如果您更喜歡功能性的方法,無論我使用列表理解,你都可以使用filter。演示:

>>> filter(lambda x: x!='x', ['id1', 'x', 'x', 'x']) 
['id1']