我有一个列表:
defaultdict(<class 'list'>, {'Web': ['site: www.domain.com'], 'Phone': ['(111) 222-333', '(222) 333-444'], 'VAT': ['987654321'], 'Fax': ['(444) 555-666', '(777) 888-999'], 'E-mail': ['adress: mail@domain.com', 'address: mail2@domain.com'], 'ID': ['number:1234567890']})
我希望清除以下字词:site:
,adress:
number:
。
输出应为:
defaultdict(<class 'list'>, {'Web': ['www.domain.com'], 'Phone': ['(111) 222-333', '(222) 333-444'], 'VAT': ['987654321'], 'Fax': ['(444) 555-666', '(777) 888-999'], 'E-mail': ['mail@domain.com', 'mail2@domain.com'], 'ID': ['1234567890']})
我知道我可以删除特定列表项中的字词,如:
for em in d["E-mail"]:
print(em.replace("address: ","",1))
但我正在寻找可以清理整个清单的东西。
答案 0 :(得分:4)
您只需要:
之后的子字符串,因此,如果字符串中没有:
,则拆分将获取子字符串,否则不会删除任何内容:
for k,v in d.items():
d[k] = [s.split(":", 1)[-1].lstrip() for s in v ]
print(d)
输出:
{'E-mail': ['mail@domain.com', 'mail2@domain.com'], 'Phone': ['(111) 222-333', '(222) 333-444'], 'ID': ['1234567890'], 'Web': ['www.domain.com'], 'VAT': ['987654321'], 'Fax': ['(444) 555-666', '(777) 888-999']}
使用[-1]
作为索引意味着我们要么得到两个中的第二个,要么是没有任何分割的唯一字符串。分裂后我们还需要lstrip
子串中的任何前导空格。
您也可以应用与向defaultdict添加数据相同的逻辑,以避免在已经分配dict值之后迭代并改变它们。
答案 1 :(得分:0)
for em in dict:
if ":" in dict[em]
a=dict[em].split(":")
a.remove(a[0])
print(a)
在此处试用此代码
答案 2 :(得分:0)
类似于Padraic Cunningham的反应,但有正则表达式:
In [39]: import re
In [40]: s = re.compile('[a-zA-Z]+:\s?')
In [41]: d={'Web': ['site: www.domain.com'], 'Phone': ['(111) 222-333', '(222) 333-444'], 'VAT': ['987654321'], 'Fax': ['(444) 555-666', '(777) 888-999'], 'E-mail': ['adress: mail@domain.com', 'address: mail2@domain.com'], 'ID': ['number:1234567890']}
In [42]: def clean(dict_):
....: for k, v in dict_.items():
....: dict_[k] = map(lambda x: s.sub('', x), v)
....:
In [43]: clean(d)
Out[43]:
{'E-mail': ['mail@domain.com', 'mail2@domain.com'],
'Fax': ['(444) 555-666', '(777) 888-999'],
'ID': ['1234567890'],
'Phone': ['(111) 222-333', '(222) 333-444'],
'VAT': ['987654321'],
'Web': ['www.domain.com']}