Python-如何从列表中删除特定单词?
我有这样一个清单:Python-如何从列表中删除特定单词?,python,regex,python-3.x,replace,Python,Regex,Python 3.x,Replace,我有这样一个清单: 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.
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']})
我知道我可以从特定列表项中删除单词,如:
for em in d["E-mail"]:
print(em.replace("address: ","",1))
但是我正在寻找可以清除整个列表的内容。您只需要
:
后面的子字符串,因此拆分将获得子字符串,或者如果字符串中没有:
,则不会删除任何内容:
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值之后必须迭代和修改这些值
for em in dict:
if ":" in dict[em]
a=dict[em].split(":")
a.remove(a[0])
print(a)
在此处尝试此代码类似于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']}
如何将值分配给defaultdict?也许您应该提到,
.strip()
会清除任何前导或尾随空格。@PM2Ring,是的,更改为lstrip并添加了注释。更好的是:)FWIW,我可能只会使用.strip
,尽管.lstrip
在这里效率更高,但我想这取决于输入数据的干净程度,以及您是否希望在该数据中保留可能的尾随空格。a.remove(a[0])
效率低下。此外,OP希望数据在dict(或defaultdict)中,他不只是想打印数据。我说的是[em].split吗?
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']}