jeff
jeff

Reputation: 1020

Extract emails from the entered values in python

My objective is: I need to ask the user to enter the number of emails and then initiate a for loop to register the input email. Then, the emails will be segregated based on '@professor.com' and '@student.com'. This will be counted as appended in the list. Following is what I have tried

email_count = int(input('how many emails you want'))
student_email_count = 0
professor_email_count = 0
student_email = '@student.com'
professor_email = '@professor.com'

for i in range(email_count):
   email_list = str(input('Enter the emails')
   if email_list.index(student_email):
       student_email_count = student_email_count + 1
   elif email_list.index(professor_email):
       professor_email_count = professor_email_count + 1

Can someone help to shorten this and write it professional with explanations for further reference? Here, the appending part is missing. Could someone through some light there too ?

Thanks

Upvotes: 0

Views: 124

Answers (2)

Chen A.
Chen A.

Reputation: 11318

It seems your iteration accepts one email at a time; and executes email_count times. You can use this simple code to count students and professors:

st = '@student.com'
prof = '@professor.com'

for i in range(email_count):
    email = str(input('Enter the email'))
    if st in email:
        student_email_count += 1
    elif prof in email:
        professor_email_count += 1
    else:
        print('invalid email domain')

If you are using Python 2.7, you should change input to raw_input.


Here's a scalable version for your code, using defaultdict to support unlimited domains.

email_count = int(input('how many emails you want'))
student_email_count = 0
professor_email_count = 0

from collections import defaultdict
domains = defaultdict(int)

for i in range(email_count):
    email = str(raw_input('Enter the email\n'))
    try:
        email_part = email.split('@')[1]
    except IndexError:
        print('invalid email syntax')
    else:
        domains[email_part] += 1

Upvotes: 1

uspectaculum
uspectaculum

Reputation: 402

prof_email_count, student_email_count = 0, 0

for i in range(int(input("Email count # "))):
    email = input("Email %s # " % (i+1)) 

    if email.endswith("@student.com"):  # str.endswith(s) checks whether `str` ends with s, returns boolean
        student_email_count += 1
    elif email.endswith("@professor.com"):
        prof_email_count += 1

Is what a (somewhat) shortened rendition of your code would look like. Main differences is that I'm using str.endswith(...) over str.index(...), also that I've removed the email_count, student_email and professor_email variables which didn't seem to be used anywhere else in the context.

EDIT:

To answer your comment on scalability, you could implement a system such as this:

domains = {
    "student.com": 0,
    "professor.com": 0,
    "assistant.com": 0
}

for i in range(int(input("Email count # "))):
    email = input("Email %s # " % (i+1))

    try:
        domain = email.split('@')[1]
    except IndexError:
        print("No/invalid domain passed")
        continue

    if domain not in domains:
        print("Domain: %s, invalid." % domain)
        continue

    domains[domain] += 1

Which allows for further scalability as you can add more domains to the domains dictionary, and access the count per domains[<domain>]

Upvotes: 1

Related Questions