【问题标题】:Remove a specific phrase from a list of lists从列表列表中删除特定短语
【发布时间】:2014-09-07 05:52:37
【问题描述】:

我已将数据存储在列表列表中(我不能使用字典,因为我需要有重复的键)。列表如下:

data = [[1, "name email@email.com address"], [2, "name2 email@@email2.com address"], ...]

我的目标是从数据列表(即列表列表)中删除电子邮件地址。不幸的是,电子邮件地址都不同。它们只有一个共同特征:它们都包含符号“@”。

我尝试使用列表推导。但是,我只能这样做,以便删除整个元素,即“名称 email@email.com 地址”被完全删除:

newlist = [element for element in data.split() if "@" not in elment]

我曾想过使用“”作为分隔符将“名称 email@email.com 地址”拆分为子列表。然而,这也带来了一个问题:它破坏了格式。我很难将这些列表组合成初始格式,因为有时“名称 email@email.com 地址”包含三个以上的单词。例如,它可以是 ""name1 name2 name3 email@email.com email2 email3 address1 address2 address3"。

最好的方法是什么?

编辑:

为了回答亚当斯密的问题,我正在寻找

data = [[1, "name address"], [2, "name2 address"], ...]

作为我的输出。换句话说,原始格式(列表列表,其中子列表包含两个元素,一个是数字,另一个是“姓名、地址、地址 1 等”)在没有电子邮件地址的情况下被保留。

【问题讨论】:

  • 我不太确定您在寻找什么。你能给出一个包含边缘情况的预期输出吗?
  • @AdamSmith,如果您不知道 OP 在寻找什么,您可能不应该回答 ;)
  • @wnnmaw 当我注意到我误解了他的问题时,我几乎立即删除了,然后要求澄清;)
  • @AdamSmith 我回答了你的问题。

标签: python


【解决方案1】:
data = [[1, "name email@email.com address"], [2, "name2 email@@email2.com address"],[3, "name1 name2 name3 email@email.com email2 email3 address1 address2 address3"]]

for ind,d in enumerate(data):
         data[ind]=[d[0]," ".join([x for x in d[1].split() if "@" not in x])] # add the int first then change elements from  index 1. 
print data

[[1, 'name address'], [2, 'name2 address'], [3, 'name1 name2 name3 email2 email3 address1 address2 address3']]

【讨论】:

    【解决方案2】:

    我认为您应该在“@”字符上进行拆分,然后遍历拆分生成的字符串列表,使用 rfind 将第一个元素从其末尾配对以查找空格字符和第二个元素,直到第一个空间。然后,删除这些子字符串。如果存在多个电子邮件地址的情况,您需要对所有剩余元素(配对第二个和第三个元素,配对第三个和第四个元素等)执行相同的操作,以查看是否有任何其他要删除的子字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2014-06-25
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      相关资源
      最近更新 更多