2014-04-10 28 views
5

Jak zwrócić wszystkie unikalne słowa z pliku tekstowego przy użyciu Pythona? Na przykład:Jak zwracać unikalne słowa z pliku tekstowego przy użyciu Python

Nie jestem robotem

Jestem człowiekiem

powinien zwrócić:

I

am

nie

robota

ludzki

Oto co zrobiłem do tej pory: plik

def unique_file(input_filename, output_filename): 
    input_file = open(input_filename, 'r') 
    file_contents = input_file.read() 
    input_file.close() 
    word_list = file_contents.split() 

    file = open(output_filename, 'w') 

    for word in word_list: 
     if word not in word_list: 
      file.write(str(word) + "\n") 
    file.close() 

Tekst Python tworzy ma w nim nic. Nie jestem pewien, co robię źle

Odpowiedz

9
for word in word_list: 
    if word not in word_list: 

każdy word jest w word_list, z definicji z pierwszej linii.

Zamiast tego logika, użyj set:

unique_words = set(word_list) 
for word in unique_words: 
    file.write(str(word) + "\n") 

set s tylko trzymać unikalnych użytkowników, co jest dokładnie to, co próbujesz osiągnąć.

Należy pamiętać, że zamówienie nie zostanie zachowane, ale nie określono, czy jest to wymagane.

+1

Niestety, nie mogę użyć polecenia Ustaw jako praca domowa to ma poprawić nasze umiejętności do pętli. – user927584

+1

Nie mam problemu z zadawaniem pytań dotyczących zadań domowych, ale musisz jasno zdefiniować ograniczenia z góry, kiedy właściwa droga do zrobienia jest arbitralnie niedozwolona. – mhlester

+0

Mój błąd możemy użyć dowolnej metody. Masz wiadomość e-mail 30 minut temu. – user927584

1
def unique_file(input_filename, output_filename): 
    input_file = open(input_filename, 'r') 
    file_contents = input_file.read() 
    input_file.close() 
    duplicates = [] 
    word_list = file_contents.split() 
    file = open(output_filename, 'w') 
    for word in word_list: 
     if word not in duplicates: 
      duplicates.append(word) 
      file.write(str(word) + "\n") 
    file.close() 

Ten kod pętle na każde słowo, a jeśli nie jest podany w liście duplicates, że dopisuje słowo i zapisuje je do pliku.

+0

Zamiast mieć dodatkową listę można użyć: 'file = open (output_filename, 'a')'? (To był mój pierwszy kod (który nie działał)) – user927584

0

Problem z twoim kodem to lista słów zawiera już wszystkie możliwe słowa pliku wejściowego. Podczas iteracji w pętli zasadniczo sprawdzasz, czy słowo w liście słów nie występuje w samym sobie. Więc zawsze będzie fałszywe. To powinno zadziałać. (Pamiętaj, że to również zachowa kolejność).

3

Po prostu przejdź przez linie w pliku i użyj zestawu, aby zachować tylko te unikalne.

from itertools import chain 

def unique_words(lines): 
    return set(chain(*(line.split() for line in lines if line))) 

Wtedy po prostu wykonaj następujące czynności, aby przeczytać wszystkie unikatowych linii z pliku i wydrukować je

with open(filename, 'r') as f: 
    print(unique_words(f)) 
1

To wydaje się być typowa aplikacja dla kolekcji:

... 
import collections 
d = collections.OrderedDict() 
for word in wordlist: d[word] = None 
# use this if you also want to count the words: 
# for word in wordlist: d[word] = d.get(word, 0) + 1 
for k in d.keys(): print k 

Mogłabyś również użyj kolekcji.Counter(), który również zliczyłby elementy, które dodasz. Kolejność słów zagubiłaby się. Dodałem linię do liczenia i utrzymania zamówienia.

1

przy użyciu regex i Set:

import re 
words = re.findall('\w+', text.lower()) 
uniq_words = set(words) 

Innym sposobem jest stworzenie Dict i wstawienie słowa jak klucze:

for i in range(len(doc)): 
     frase = doc[i].split(" ") 
     for palavra in frase: 
      if palavra not in dict_word: 
       dict_word[palavra] = 1 
print dict_word.keys() 
0

użyć zestawu. Nie musisz importować niczego, aby to zrobić.

#Open the file 
my_File = open(file_Name, 'r') 
#Read the file 
read_File = my_File.read() 
#Split the words 
words = read_File.split() 
#Using a set will only save the unique words 
unique_words = set(words) 
#You can then print the set as a whole or loop through the set etc 
for word in unique_words: 
    print(word) 
0
string = "I am not a robot\n I am a human" 
list_str = string.split() 
print list(set(list_str)) 
+0

Nie działa nawet na przykładowym przykładzie OP. Podpowiedź: '.split()' różni się od '.split ('')' – trentcl

+0

@trentcl hwz teraz? ... thnx ma punkt ... naprawdę różnicę pomiędzy '.split()' i '.split ('')' –

+0

Lepiej, ale szczerze, to pytanie ma ponad 3 lata, a zaakceptowana odpowiedź jest w zasadzie taka sama jak twoja, z wyjątkiem wyjaśnień, więc przegłosowałem tę. Jeśli masz coś konstruktywnego do dodania, np. Budowanie zestawu bez wcześniejszego załadowania całego pliku do pamięci, byłoby to dobrą odpowiedzią; jeśli to sprowadza się do "użycia" zestawu ", nie wiem, dlaczego się martwiłeś. – trentcl