Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Dictionaries

Dictionaries 2 Χρόνια 8 Μήνες πριν #3216

  • einsteinj
  • Το Άβαταρ του/της einsteinj
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 18
Καλησπέρα σε όλους/ες!
Επανέρχομαι ως νέος στην Python, για μια βοήθεια πάλι!
Έχω ένα .txt αρχείο, που έχει λέξεις και θα πρέπει αφού δώσουμε το όνομα του αρχείου ο χρήστης, να το διαβάζει, να "κοιτά" για την λέξη "From " και μετά να χωρίζει την κάθε λέξη (με την εντολή split()). Η 2η λέξη θα είναι διευθύνσεις email. Στόχος είναι να υπολογίζει το πόσες φορές εμφανίζεται το κάθε email και έτσι θα επιστρέφει το συγκεκριμένο email που εμφανίστηκε περισσότερες φορές, μαζί με τον αριθμό του. π.χ. Αυτή η διεύθυνση ηλεκτρονικού ταχυδρομείου προστατεύεται από τους αυτοματισμούς αποστολέων ανεπιθύμητων μηνυμάτων. Χρειάζεται να ενεργοποιήσετε τη JavaScript για να μπορέσετε να τη δείτε., 5
Δηλαδή το email αυτό (που θεωρούμε ότι είναι και ο αποστολέας) εμφανίζεται 5 φορές.
Εγώ έγραψα αυτόν τον κώδικα, αλλά μου επιστρέφει όλα τα emails. Το ερώτημά μου είναι, πως τώρα γεμίζω το dictionary ώστε να κάνω μετά search με ένα for loop?
Ο κώδικας είναι:

name=raw_input('Enter file:')
fhand=open(name,'r')
counts=dict()           # Keno dictionary.
for line in fhand:	
	if not line.startswith('From '):continue
	words=line.split()
	emails=words[1] # H prwti lexi, meta to 'From '.
 
	for email in emails:	
		counts[email]=counts.get(email,0)+1
	print emails

Ευχαριστώ πολύ για τις όποιες συμβουλές σας-υποδείξεις σας!
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Dictionaries 2 Χρόνια 8 Μήνες πριν #3217

  • kamar
  • Το Άβαταρ του/της kamar
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 405
  • Ληφθείσες Ευχαριστίες 87
Δες τον παρακάτω κώδικα:

emails =["johny@gmail.com",
        "johny1@gmail.com",
        "other_johny@yahoo.com",
         "johny2@gmail.com",
        "johny@gmail.com",
        "other_johny@yahoo.com",
         "johny@gmail.com"]
 
count_emails = {}
 
for email in emails:
    if not email in count_emails.keys():
        count_emails[email] = 1
    else:
        count_emails[email] = count_emails[email] + 1
 
for k, v in count_emails.items():
    print(k, v)
Γράφω σε Python 3
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Dictionaries 2 Χρόνια 8 Μήνες πριν #3222

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 433
  • Ληφθείσες Ευχαριστίες 74
Κώδικας:
file_name = input("Δώσε το όνομα του αρχείου: ")
 
file = open(file_name, "r")
 
emails_count = {}
 
for line in file:
 
    #Βλέπω εάν η γραμμή μου εμπεριέχει την λέξη From.
    if line.startswith("From"):
        words = line.split() #Xωρίζω τις λέξεις.
        email  = words[1]   #Πέρνω την δεύτερη λέξη που ειναι το email.
 
        #-----------Αυτο είναι το κομμάτι που δεν ήξερες πως να κάνεις-----------#
        #Εάν είναι η πρώτη φορά που βάζω αυτό το email στο
        #λεξικό μου, τότε του αναθέτω αρχική τιμή ένα.
        if email not in emails_count.keys():
            emails_count[ email ] = 1 #Δημιουργώ ένα "κλειδή λεξικού" και του δίνω την τιμή ένα.
 
        #Υπάρχει ήδη το email στο λεξικό μου που σημένει ότι τώρα πρέπει
        #να το αυξήσω κατά ένα γιατί το έχω ήδη δει τουλάχιστον μία φορά.
        else:
            emails_count[ email ] += 1 #Αυξάνω την μέτρηση του συγκεκριμένου email κατά ένα.
        #-----------Αυτο είναι το κομμάτι που δεν ήξερες πως να κάνεις-----------#
 
 
 
for key in emails_count.keys():
    print("Το email:",key,"εμφανίζεται:",emails_count[key],"φορές.")
 

Αρχείο.txt που χρησιμοποίησα για τεστάρισμα:
From: nbampaliaris@gmail.com
	Hello there mate! I sended you this email...
 
 
 
From: nbampaliaris@gmail.com
	Hello there again!....
 
 
From: petrosIwannidis@yahoo.gr
	Mr, i would like to report you.....
 
 
From: anastasiaGianoudi@hotmail.com
	Hello Nick!......

Πρέπει να ξέρεις ότι το κειδή(key) σε ένα λεξικό είναι το όνομα μιας λέξης μέσα στο
λεξικό σου, ενώ η τιμή(value) είναι η τιμή στην οποία αναφέρεται η λέξη.
Εάν δεν ξέρεις πως λειτουργούν τα λεξικά στην python λογικά δεν θα καταλάβεις τον
κωδικά μου. Εάν δεν ξέρεις μην διστάσεις να το ρωτήσεις :)

Γενικά όταν δηλώνεις ένα λεξικό counts = dic() ή μπορείς να το δηλώσεις και έτσι counts = {}
για να δημιουργήσεις ένα καινούριο κλειδή και να του δώσεις μια αρχική τιμή κάνεις το εξής:
counts["Όνομα_Κλειδιού"] = τιμή

Τώρα εάν θέλεις να πάρεις την τιμή ενώς κλειδιού από το λεξικό σου κάνεις το εξής:
variable = counts["Όνομα_Κλειδιού"]

Εάν δεν γνωρίζεις το κλειδί, τότε μπορείς να πάρεις μια λίστα κλειδιών χρησιμοποιώντας την
μέθοδο .keys():
KEYS = counts.keys()
 
for key in KEYS:
    print(key)


Επίσης θα σου πω και κάποια λαθάκια που έκανες:

for line in fhand:	
	1)if not line.startswith('From '):continue
	2)words=line.split()
	3)emails=words[1] # H prwti lexi, meta to 'From '.
 
 
	4)for email in emails:
		counts[email]=counts.get(email,0)+1
	5)print emails

Στην γραμμή 4, εσύ νομίζεις ότι η μεταβλητή emails είναι μια λίστα ενώ δεν είναι.
Στην γραμμή 3 το emails=words[1] θα σου δώσει ένα string το οποίο θα έιναι ένα email και όχι
μια λίστα από emails. Όταν το loop σου ξανατρέξει τότε η μεταβλητή emails θα αντικατασταθεί
με ένα άλλο email το οποίο διαβάστηκε ποιο μετά στο αρχείο.
Τελευταία διόρθωση: 2 Χρόνια 8 Μήνες πριν από babaliaris1.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Dictionaries 2 Χρόνια 8 Μήνες πριν #3223

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 674
  • Ληφθείσες Ευχαριστίες 109
Μιας και τώρα μαθαίνεις, καλό είναι να μελετήσεις τον κώδικα που σου έδωσαν ή/και να προσπαθήσεις να λύσεις το πρόβλημα μόνη/ος σου.

Για την ιστορία, o «pythonic» τρόπος για να κάνεις αυτό που ζητάς είναι η κλάση Counter
docs.python.org/2/library/collections.html#collections.Counter
Τελευταία διόρθωση: 2 Χρόνια 8 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Dictionaries 2 Χρόνια 8 Μήνες πριν #3228

  • einsteinj
  • Το Άβαταρ του/της einsteinj
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 18
ευχαριστώ πολύ για το link. Ναι τους μελέτησα και ήταν αρκετά διαφωτιστικοί και με βοήθησαν να φτάσω στη λύση!
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Dictionaries 2 Χρόνια 8 Μήνες πριν #3229

  • einsteinj
  • Το Άβαταρ του/της einsteinj
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 18
φίλε/η kamar! Ευχαριστώ πολύ για την άμεση ανταπόκρισή σου! Μελέτησα τον κώδικά σου, αλλά εγώ δεν θέλω να μου επιστέφει το κάθε email που έχουμε στο dictionary και τις αντίστοιχες φορές που εμφανίζεται αυτό, αλλά ποιο ήταν εκείνο το email που εμφανίστηκε τις περισσότερες φορές!
π.χ. Αυτή η διεύθυνση ηλεκτρονικού ταχυδρομείου προστατεύεται από τους αυτοματισμούς αποστολέων ανεπιθύμητων μηνυμάτων. Χρειάζεται να ενεργοποιήσετε τη JavaScript για να μπορέσετε να τη δείτε., 5, που σημαίνει ότι το email αυτό, εμφανίστηκε τις περισσότερες φορές από όλα τα υπόλοιπα mails. Σε γλώσσα στατιστικής (δεν γνωρίζω αν είσαι μαθηματικός,στατιστικός ή όχι:-)), το ιστόγραμμα συχνοτήτων!
Θα παραθέσω τους κώδικές μου σε νέο post. :-)
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Dictionaries 2 Χρόνια 8 Μήνες πριν #3230

  • einsteinj
  • Το Άβαταρ του/της einsteinj
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 18
φίλε/η @babaliaris1 ευχαριστώ πάρα πολύ για την υπομονή σου και για την πολύ εκτενέστερη περιγραφή του κώδικα όπως και για τις επισημάνσεις σου στον κώδικά μου! Πραγματικά πάρα πολύ διαφωτιστικοί!! Λοιπόν έχω να σου πω τα εξής:
α) αυτό που θέλαμε ήταν, να μας επιστρέφει το email εκείνο, που εμφανίζεται τις περισσότερες φορές και όχι απλά να βρίσκει τα emails μέσα στο αρχείο και να μας τα τυπώνει.
Θα αναρτήσω τους κώδικες που έκανα και με 2 τρόπους και μου έτρεξε :-)
β) Όσο για τις παρατηρήσεις στη γραμμή 4, επειδή το words είναι "τεμαχισμένο" σε λέξεις και ζητάμε την 2η λέξη, να την εκχωρήσει στα emails, θεώρησα πως είναι list(). Γιατί, αν δώσουμε μία εκτύπωση κάτω από τη γραμμή 3, θα μας επιστέψει ένα κατεβατό με τα mails.
Τεσπα, πάντως σε ευχαριστώ πάρα πολύ για το εκτενές και γεμάτο πληροφορία -λεπτομέρεια κείμενό σου! Θα αναρτήσω του κώδικες για να δεις τι έκανα.
Καλή συνέχεια!
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Dictionaries 2 Χρόνια 8 Μήνες πριν #3231

  • einsteinj
  • Το Άβαταρ του/της einsteinj
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 18
Μετά από προσπάθεια, και πάντα με την βοήθεια αρκετών από εδώ μέσα pythonistes, τελικά κατάφερα και έγραψα τον κώδικα που ήθελα και μου τρέχει μια χαρά. Το καλό είναι (για εμένα...είναι καλό σημάδι ότι μαθαίνω :-)) ότι έκανα και με έναν άλλο τρόπο-μέθοδο για να πάρω το ίδιο αποτέλεσμα και αυτό με χαροποιεί ιδιαίτερα :-) :-) !
Οι κώδικές μου είναι:

A τρόπος:
name=raw_input('Enter file:')					# Prompt the user to enter a file name.
fhand=open(name,'r')						# Open the file to read.
emails_counts=dict()						# Create an empty dictionary.
for line in fhand:	
	if line.startswith('From '):				# Condition, to manipulate with lines, starting with 'From '.
		words=line.split()				# We split the total text into single words.
		email=words[1]					# Assign in emails, the second words, which is the email address.
		if email not in emails_counts.keys():	        # Check, every email if it is in the dictionary, else add it and increase the counter by 1.
			emails_counts[email]=1
		else:
			emails_counts[email]+=1
maxval=None 							# Starting values for maxval and maxkii.
maxkii=None 									
for kii,val in emails_counts.items():			        # For loop through the dictionary .items(), which are (key:value).
	if maxval==None or maxval < val:	
		maxval=val
		maxkii=kii
print maxkii,maxval					        # Print the maximum key(maxkii) and maximum value (maxval).

Β τρόπος:
name=raw_input('Enter file:')			
fhand=open(name,'r')
count=dict()
 
for line in fhand:	
	if line.startswith('From '):	
		words=line.split()
		email=words[1]
		count[email]=count.get(email,0)+1 	
 
maxval=None
maxkii=None
for kii,val in count.items():	
 
	if maxval==None or maxval < val:	
		maxval=val
		maxkii=kii
 
print maxkii, maxval			
 

Ευχαριστώ πολύ όλους/ες! Καλό σκ να έχουμε :-)
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Dictionaries 2 Χρόνια 8 Μήνες πριν #3232

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 674
  • Ληφθείσες Ευχαριστίες 109
Nice, και απλά για να το δεις:
from collections import Counter
 
def parse_emails():
    # implement your own 
    return ["a", "b", "c", "a", "a", "b", "a", "d", "e"]
 
emails = parse_emails()
histogram = Counter(emails)
print(histogram.most_common(2))      # [('a', 4), ('b', 2)]
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": einsteinj

Dictionaries 2 Χρόνια 8 Μήνες πριν #3233

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 433
  • Ληφθείσες Ευχαριστίες 74
Μια χαρά, ωραίος ο κώδικας. Ναι όντως εγώ εμφάνιζα όλα τα emails ενώ θέλουν μόνο αυτό που επαναλαμβάνεται περισσότερο :P .
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Dictionaries 2 Χρόνια 8 Μήνες πριν #3235

  • einsteinj
  • Το Άβαταρ του/της einsteinj
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 18
Ευχαριστώ για την βοήθειά σου πάντως!! Θέλω πολλάααα ψωμιά ακόμη για να λέω ότι ξέρω καλά Python! Αλλά αφού υπάρχει υπομονή και θέληση, όλα θα γίνουν... :-)
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.367 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου