Создание функции профиля загрузки в python - PullRequest
1 голос
/ 02 апреля 2012

Хорошо, я пытаюсь создать функцию, которая обновляет / создает два словаря для включения данных из открытого файла.

Пример текстового файла будет выглядеть примерно так:

Dunphy, Claire  # Name of the person
Parent Teacher Association  # The networks person is associated with
Dunphy, Phil  # List of friends
Pritchett, Mitchell
Pritchett, Jay

Dunphy, Phil
Real Estate Association
Dunphy, Claire
Dunphy, Luke

Pritchett, Jay
Pritchett, Gloria
Delgado, Manny
Dunphy, Claire

def load_profiles(profiles_file, person_to_friends, person_to_networks):
  • предположим, что файл_файла уже открыт, поэтому нет необходимости передавать аргумент для открытия файла

  • человек-друг - это словарь, каждый ключ - это человек (str), а каждое значение - это друзья этого человека (список strs).

  • человек в сети - это словарь, каждый ключ - это человек (str), а каждое значение - это сеть, к которой принадлежит человек (список strs).

Так что, я думаю, было бы легче разделить эту проблему на подфункцию / вспомогательную функцию, одну функцию, которая создает словарь для друга, и другую, которая создает личность для сетевого словаря.

На данный момент для функции человека к другу я придумал:

def person_to_friend(profiles_file):

    person = {}
    friends = []

    for name in profiles_file:
        name = name.strip(). split('\n')

        if "," in name and name not in person.keys():
            person[key].append(name)

    return person

Но это возвращает пустой словарь, не уверен, что я делаю неправильно. Также не уверен, как добавить друзей в качестве значений для человека.

Ответы [ 3 ]

1 голос
/ 02 апреля 2012

Ваша вспомогательная функция пытается перебрать весь файл.Хотя использование отдельной функции для добавления записей в словарь не является плохой идеей, ее, вероятно, следует выполнять внутри одного цикла, например:

def load_profiles(profiles_file, person_to_friends, person_to_networks):
    friends = []
    networks = []
    for line in profiles_file:
        if not line.strip(): # we've just finished processing an entry, 
                             # need to get ready for the next one
            person_to_friends[name] = friends
            person_to_networks[name] = networks
            friends = []
            networks = []
        else:
            if friends == networks == []: # we haven't read anything yet,
                name = line               # so this must be the name
            elif ',' in line:
                friends.append(line)
            else:
                associations.append(line)

Это, вероятно, слишком упрощено (например,он не проверяет, указаны ли сети перед друзьями), но это уже слишком много кода для ответа на домашнее задание.Я надеюсь, что это компенсировано ошибками в нем, так как я не проверял это :) Ура.

1 голос
/ 02 апреля 2012

Несмотря на проблему с отступом в исходной формулировке проблемы (которая вызвала бы синтаксическую ошибку, которую вы бы быстро исправили), ваша функция person_to_friend имеет ошибку в вызове словаря: person[key].append(name) должно прочитать person[key] = name.В остальном это выглядит нормально.

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

В противном случае, я просто хотел поблагодарить вас за предоставление замечательный пример того, как правильно составить homework вопрос здесь, на StackOverflow.Помимо форматирования, это ясно, сжато, детально ориентировано и очень хорошо говорит о ваших способностях программиста во время работы с текущими классами.Желаем удачи!

0 голосов
/ 02 апреля 2012

Вы возвращаетесь из цикла for, поэтому в основном вы возвращаетесь после первой итерации.

Кроме того, я не совсем понимаю name = name.strip().split('\n').Разве name уже не является строкой от profiles_file?А также убедитесь, что key из person[key].append(name) существует и person[key] является списком.

Я думаю, вам следует немного переосмыслить свой алгоритм.

РЕДАКТИРОВАТЬ: Может быть, что-то вроде этого будетработать для вас:

f = open(profiles_file)
person = {}
friends = []
groups = f.read().split('\n\n')
for g in groups:
    g = g.split('\n')
    person[g[0]] = []
    for friend in g[1:]:
        if ',' in friend:
             person[g[0]].append(friend)

Конечно, чтобы сделать это, не открывая файл более одного раза, вы можете просто создать 2 словаря или добавить еще один ключ к существующему, например person[key]['friends'] и person[key]['networks'],Затем поставьте else до последнего if.

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