Почему я не могу искать в словаре, который я создал (Python)? - PullRequest
0 голосов
/ 19 апреля 2011

В этой программе я делаю словарь из простого текстового файла, в основном я считаю количество слова, встречающегося в документе, слово становится ключом, а время его появления - значением.Я могу создать словарь, но затем я не могу искать в словаре.Вот мой обновленный код с участием ваших парней.Я очень ценю помощь.

from collections import defaultdict
import operator
def readFile(fileHandle):
    d = defaultdict(int)
    with open(fileHandle, "r") as myfile:
        for currline in myfile: 
            for word in currline.split():
                d[word] +=1
    return d

def reverseLookup(dictionary, value):
    for key in dictionary.keys():
        if dictionary[key] == value:
            return key
    return None

afile = raw_input ("What is the absolute file path: ")
print readFile (afile)

choice = raw_input ("Would you like to (1) Query Word Count (2) Print top words to a new document     (3) Exit: ") 
if (choice == "1"):
    query = raw_input ("What word would like to look up? ")
    print reverseLookup(readFile(afile), query)
if (choice == "2"):
    f = open("new.txt", "a")
    d = dict(int)
    for w in text.split():
        d[w] += 1
    f.write(d)
    file.close (f)
if (choice == "3"):
    print "The EXIT has HAPPENED"
else:
    print "Error"

Ответы [ 4 ]

4 голосов
/ 19 апреля 2011

Ваш подход очень сложен (и синтаксически неверен, по крайней мере, в вашем примере размещенного кода).

Кроме того, вы связываете встроенное имя dict, что тоже проблематично.

Кроме того, эта функция уже встроена в Python:

from collections import defaultdict

def readFile(fileHandle):
    d = defaultdict(int)  # Access to undefined keys creates a entry with value 0
    with open(fileHandle, "r") as myfile:   # File will automatically be closed
        for currline in myfile:             # Loop through file line-by-line
            for word in currline.strip().split(): # Loop through words w/o CRLF
                d[word] +=1                 # Increase word counter
    return d

Что касается вашей функции reverseLookup, см. Ответ ypercube.

3 голосов
/ 19 апреля 2011

Ваш код возвращается после просмотра первой пары (ключ, значение).Вам нужно выполнить поиск по всему словарю, прежде чем вернуть, что значение не найдено.

def reverseLookup(dictionary, value):
    for key in dictionary.keys():
        if dictionary[key] == value:
            return key
    return None

Вам также не следует возвращать "error", так как это может быть слово и, следовательно, ключ в вашем словаре!

1 голос
/ 19 апреля 2011

В зависимости от того, как вы собираетесь использовать эту reverseLookup() функцию, ваш код может оказаться намного счастливее, если вы используете два словарей: создайте первый словарь, как вы уже сделайте, а затем создайте второй словарь, который содержит сопоставления между числом вхождений и словами, которые встречались столько раз. Тогда вашему reverseLookup() не нужно будет выполнять цикл for k in d.keys() для при каждом поиске . Этот цикл будет происходить только один раз, и каждый последующий поиск будет выполняться значительно быстрее.

Я собрал (но не тестировал) некоторый код, который показывает, о чем я говорю. Я украл подпрограмму readFile() Тима, потому что она мне больше нравится, но взял его хороший локальный словарь функций d и переместил его в глобальный, просто чтобы функции были короткими и приятными. В «реальном проекте» я бы, вероятно, обернул все это в класс, чтобы разрешить произвольное количество словарей во время выполнения и обеспечить разумную инкапсуляцию. Это просто демонстрационный код. :)

import operator
from collections import defaultdict

d = defaultdict(int)
numbers_dict = {}

def readFile(fileHandle):
    with open(fileHandle, "r") as myfile:
        for currline in myfile:
            for word in currline.split():
                d[word] +=1
    return d


def prepareReverse():
    for (k,v) in d.items():
        old_list = numbers_dict.get(v, [])
        new_list = old_list << k
        numbers_dict[v]=new_list

def reverseLookup(v):
    numbers_dict[v]

Если вы намереваетесь выполнить два или более поисков, этот код обменяет память на скорость выполнения. Итерация по словарю выполняется только один раз (итерация по всем элементам не является сильной стороной диктата), но за счет дублирования данных в памяти.

0 голосов
/ 19 апреля 2011

Поиск не работает, потому что у вас есть словарь, сопоставляющий слово с его счетом, поэтому получение числа вхождений для слова должно быть просто dictionary[word].Вам не нужен reveseLookup(), в dict уже есть метод .get(key, default_value): dictionary.get(value, None)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...