2016-08-16 107 views
2

我的字典值是在每個術語末尾應該有'|x'的字符串。有些字符串包含許多術語,它們之間用space分隔。Python字典替換值並保存在字典中

我試圖刪除沒有'|x'的值中的術語,但字典沒有保存新值。

d={'food': u'burger|x fries|x soda pie|x', 'transport': u'bus|x', 'animal': u'cat|x'} 

for k,v in d.iteritems(): 
    for t in v.split(' '): 
     if '|x' in v: 
      v=v.replace(t,'') 

輸出:

d 
{'food': u'burger|x fries|x soda pie|x', 'animal': u'cat|x', 'transport': u'bus|x'} 

輸出,我想:

{'food': u'burger|x fries|x pie|x', 'animal': u'cat|x', 'transport': u'bus|x'} 

爲什麼不值會被替換?

+0

你想幹什麼輸出,因爲我不明白你題。 –

+0

請參閱我的編輯 – jxn

+1

該值沒有被替換,因爲您從未替換它。你在'v = v.replace(...)'之後需要'd [k] = v'。 – kindall

回答

5

你只是創建一個新的字符串,並沒有更新字典中的值。

您可以使用字典理解,而不是刪除這些項目:

d = {'food': u'burger|x fries|x soda pie|x', 'transport': u'bus|x', 'animal': u'cat|x'} 
d = {k: ' '.join(i for i in v.split() if i.endswith('|x')) for k, v in d.iteritems()} 
print d 
# {'food': u'burger|x fries|x pie|x', 'transport': u'bus|x', 'animal': u'cat|x'} 

注意split()在這方面可以替代split(' ')

+1

小記 - 如果OP使用Python 2(可能來自調用iteritems()),那麼在dict理解中使用iteritems()也可能更好。 – Karin

+0

@Karin Yep,謝謝你指出。 –

+1

另一個小點 - 因爲每個術語都必須用'| x'結尾,所以在i中使用'decendswith('| x')'而不是''| x'(它可以匹配術語中的任何位置)。 – mhawke

1

輸入
d = {'food': u'burger|x fries|x soda pie|x', 'transport': u'bus|x', 'animal': u'cat|x'} 

代碼
for (i, j) in d.iteritems(): 
    x = j.split() 
    for k in x: 
     if not k.endswith('|x'):    
      x.remove(k) 
    d[i] = " ".join(x) 

輸出
d = {'food': u'burger|x fries|x pie|x', 'transport': u'bus|x', 'animal': u'cat|x'} 
+0

您沒有更新字典中的值來獲得預期的結果。 – d3r1ck

+0

該解決方案非常簡單易懂。你可以調整它,使其更先進。 – d3r1ck

0

到詞典理解的替代方法是更新字典到位

d = {'food': u'burger|x fries|x soda pie|x', 'transport': u'bus|x', 'animal': u'cat|x'} 

for k in d: 
    terms = d[k].split() 
    d[k] = ' '.join(term for term in terms if term.endswith('|x')) 

或者shoehorning它變成一個操作:因爲字典理解產生第二字典這可能是非常大的字典更好

for k in d: 
    d[k] = ' '.join(term for term in d[k].split() if term.endswith('|x'))