【问题标题】:Python dictionary - list issue (2.7.XX)Python 字典 - 列表问题 (2.7.XX)
【发布时间】:2016-06-09 14:25:40
【问题描述】:

我对 python 还很陌生,我目前正在尝试做一个我似乎无法完成的练习。

基本上,我有一个包含电子邮件对话的长文本 (.txt) 文档。现在,我必须通读文档并列出所有电子邮件地址(我可以正确)

name = raw_input("Enter file:")
if len(name) < 1 : name = "file.txt"
handle = open(name)
for line in handle:
    email = line.strip()
if email.startswith('From: '):
    name = email.split()
    print name

由此产生的输出是一个多行列表,每行包含 2 个部分。

['From:', 'email@address.com'] 
['From:', 'email@address.com']
['From:', 'email@address.com']
['From:', 'email@address.com']
['From:', 'email@address.com']

现在,我的问题是我必须将这些电子邮件地址放入字典中并在其旁边进行计数,例如

email@address.com 5 

所以现在我使用 .get() 函数将循环添加到代码中

name = raw_input("Enter file:")
if len(name) < 1 : name = "file.txt"
handle = open(name)
for line in handle:
    email = line.strip()
if email.startswith('From: '):
    name = email.split()
    print name
for names in name:
    count[names] = count.get(names,0) + 1
    print count

此时我得到了完整的列表和下面的输出:

{'From:': 1}
{'From:': 1, 'email@address.com': 1}

我现在如何才能在字典中只获取 email@address.com?似乎我无法将完整列表放入字典中,并且添加了我不需要的“发件人”。然后,我将尝试编写其余部分以打印字典中的最大计数,这将是我想要的输出。

我已经坚持了一段时间,不幸的是,我需要保持简单,并减去我使用过的功能。我试图环顾互联网和这里,但到目前为止,我没有尝试过任何帮助我。我对此很陌生,所以如果修复很明显,我很抱歉

提前致谢。

【问题讨论】:

    标签: python list for-loop dictionary


    【解决方案1】:
    lst = (['From:', 'email@address.com'],
    ['From:', 'email@address.com'],
    ['From:', 'email@address.com'],
    ['From:', 'email@address.com'],
    ['From:', 'email@address.com']
    )
    
    emails = {}
    for i in lst:
        email = i[1]
        if email in emails.keys():
            emails[email] += 1
        else:
            emails[email] = 1
    print emails
    
    >>> {'email@address.com': 5} 
    

    将您找到的邮件添加到列表中,然后对其进行迭代,或者您可以一次性完成此操作

    name = raw_input("Enter file:")
    if len(name) < 1 : name = "file.txt"
    handle = open(name)
    
    emails = {}
    for line in handle:
        email = line.strip()
        if email.startswith('From: '):
            name = email.split()
            if name[1] in emails.keys():
                emails[name[1]] += 1
            else:
                emails[name[1]] = 1
    
    print emails
    

    【讨论】:

    • 不幸的是,这对我没有帮助,我需要从我的“名称”变量中检索信息(您输入为 lst 的信息)
    【解决方案2】:

    这是使用列表推导的更简洁的解决方案。

    lst = (['From:', 'email@address.com'],
    ['From:', 'email@address.com'],
    ['From:', 'email@address.com'],
    ['From:', 'email@address.com'],
    ['From:', 'email@address.com'],
    ['From:', 'email@addres.com'],
    ['From:', 'email@addres.com'],
    ['From:', 'email@addres.com'],
    ['From:', 'email1@addres.com'],
    ['From:', 'email1@addres.com'],
    ['From:', 'email1@addres.com'],
    ['From:', 'email1@addres.com'],
    ['From:', 'email1@addres.com'],
    )
    
    unique_set = set([x[1] for x in lst])
    
    emails = {}
    for i in unique_set:
        emails[i] = len([x for x in lst if x[1] == i])
    
    print emails
    

    在上面的代码中,我首先通过检查您的电子邮件元组中的第二项,即 x[1],在您的列表中创建一个唯一条目的集合。 python set 会为你做这件事。一旦我有了这个集合,我过滤输入列表并使用结果列表上的 len 方法计算原始列表中的条目数。我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      open() 返回一个文件对象,最常与两个参数一起使用:open(filename, mode)。

      f = open('filename', 'r')#In your case you are reading from the file.
      
          for line in f:
                  print line,
      

      在循环之前,您可以设置所有条件以从“发件人:”开始阅读

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-28
        • 1970-01-01
        • 1970-01-01
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多