zynif Δημοσ. 13 Απριλίου 2014 Δημοσ. 13 Απριλίου 2014 Λοιπόν έχω δύο λίστες με strings την StopUK και την bagofwords. Πρέπει να επιλέξω τυχαία κάποια στοιχεία από την bagofwords τα οποία όμως δεν πρέπει να είναι στην StopUK Έχω γράψει το παρακάτω το όποιο όμως δεν δουλεύει... f= open('/tmp/StopEng.txt') for line in f: StopUK.append(line) for t in range(0,SetWords): k=random.randint(0,bag_of_words.__len__()-1) while bag_of_words[k] in StopUK==True: print ('new rand') k=random.randint(0,bag_of_words.__len__()-1) print ('random choice',bag_of_words[k])
pmav99 Δημοσ. 13 Απριλίου 2014 Δημοσ. 13 Απριλίου 2014 1. Όταν θες να διαβάσεις αρχεία να χρησιμοποιείς την with. Διάβασε εδώ για λεπτομέρειες. Τα σχετικά με το άνοιγμα αρχείων είναι στο τέλος, αλλά ρίξε ένα μάτι σε όλο για να καταλάβεις πως λειτουργεί το with. Το πλεονέκτημα του ανοίγματος των αρχείων με το with είναι ότι το αρχειο θα κλείσει ακόμα και αν ο κώδικας μέσα στο with block σηκώσει κάποιο Exception. 2. Ο πιο εύκολος τρόπος για να βρεις στοιχεία που υπάρχουν σε μία λίστα αλλά δεν υπάρχουν σε μία άλλη, είναι να χρησιμοποιήσεις θεωρία συνόλων (μετέτρεψε τις lists σε sets). Η μέθοδος που ψάχνεις είναι η set.difference. https://docs.python.org/2/library/stdtypes.html#set 1
zynif Δημοσ. 13 Απριλίου 2014 Μέλος Δημοσ. 13 Απριλίου 2014 Δεν φαίνεται να λειτουργεί όμως... Βασικά αυτό που θέλω είναι να διαβάζω ένα αρχείο κειμένου και σε μια λίστα Α να βάζω όλες τις λέξεις του αρχείου. Έχω και μια λίστα την Β και θέλω να φτιάξω μια νέα λιστα Γ που περιέχει όλα τα στοιχεία της Α που δεν ανήκουν στην Β Διαβάζω το αρχείο (λίστα Α) ως εξής with codecs.open(filepath,'r',encoding='utf8') as f: for word in f.read().split(): doc_text.append(word) τα στοιχεία της Β είναι επίσης σε ένα αρχείο. Κάθε γραμμή του αρχείου περιέχει ένα στοιχείο . with open('/tmp/StopEng.txt') as f: for line in f: StopUK.append(line) και παίρνω την διαφορά τους ως print (doc_text.__len__()) bag_of_words=list(set(doc_text).difference(set(StopUK))) print (bag_of_words.__len__()) Ενώ όμως η bag_of_words έχει μικρότερο μήκος από το doc_text εξακολουθεί να περιέχει στοιχεία της StopUK
pmav99 Δημοσ. 13 Απριλίου 2014 Δημοσ. 13 Απριλίου 2014 (επεξεργασμένο) Όταν θες να βλέπεις το μήκος ενός iterable, χρησιμοποιείς τη len(). import codecs with codecs.open("foo", "rb", "utf-8") as fd: doc_text = fd.read().split() with codecs.open("goo", "rb", "utf-8") as fd: stop_uk = fd.read().split() bag_of_words = set(doc_text).difference(set(stop_uk)) for word in bag_of_words: if word in stop_uk: print("problem") # it will never be executed! Επεξ/σία 14 Απριλίου 2014 από pmav99 1
iceblade Δημοσ. 14 Απριλίου 2014 Δημοσ. 14 Απριλίου 2014 import random with open("bagofwords.txt", 'r') as bag_file, open("stopuk.txt", 'r') as stop_file: bag = {x.strip() for x in bag_file.readlines()} stop = {x.strip() for x in stop_file.readlines()} items = 2 # how many items do you want? print(random.sample(bag-stop, items)) 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα