2016-08-16 103 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'))