【问题标题】:Python - how to remove specific words from list?Python - 如何从列表中删除特定单词?
【发布时间】:2015-07-19 11:16:10
【问题描述】:

我有一个类似的列表:

 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))

但我正在寻找可以清理整个列表的东西。

【问题讨论】:

  • 如何将值分配给 defaultdict?

标签: python regex python-3.x replace


【解决方案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 值后对其进行迭代和变异。

【讨论】:

  • 也许你应该提到.strip() 清除任何前导或尾随空格。
  • @PM2Ring,是的,改成 lstrip 并添加了注释。
  • 更好。 :) FWIW,我可能只使用.strip,即使.lstrip 在这里效率更高——但我想这取决于输入数据的干净程度,以及是否要保留该数据中可能的尾随空格。
【解决方案2】:
for em in dict:

   if ":" in dict[em]
   a=dict[em].split(":")
   a.remove(a[0])
   print(a)

在这里试试这个代码

【讨论】:

  • a.remove(a[0]) 效率低下。此外,OP 想要字典(或默认字典)中的数据,他不只是想打印它。
  • 我说的是 [em].split 吗?
【解决方案3】:

类似于 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']}

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多