2016-12-12 13 views
0

Я новичок в Python и в настоящее время ищут стажировку или работу. В настоящее время я работаю над программой в Python, который читает файл, содержащий данные в этой форме:Выполнение поиска по ID в списке друзей в Python

Id;name;surname;age;gender;friends; 

Id и возраста являются положительными целыми числами,

пола может быть «мужчина "или" женщина ",

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

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

Вторая часть - создать функцию с двумя аргументами (Id1, Id2), которая возвращает True, если человек с Id2 является другом для лица с Id1. В противном случае возвращается false.

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

people = open(r"data.txt") 

class People: 

    id = None 
    name = '' 
    surname = '' 
    age = None 
    gender = ['male', 'female'] 
    friends = [] 
    #def people(self): 
     # person = {'id': None, 
      #  'name': '', 
      #  'surname': '', 
      #  'age': None, 
      #  'gender': ['male', 'female'], 
      #  'friends': [] 
     #   } 
     # return person 

    def community(self): 
     comm = [People()] 
     return comm 

def is_friend(id1, id2): 

    if (id1 in People.friends) & (id2 in People.friends): 
     return True 

people.close() 
+0

Добро пожаловать в SO, вы найдете сообщество, очень желающее помочь, если вы сможете показать, что вы пробовали, и то, что вы застряли. Модуль 'csv' поможет вам прочитать ваши данные, и вы должны подумать о соответствующих структурах данных для вашей информации. – AChampion

+0

Я бы сделал класс «Личность», а потом просто их друзья были набором идентификаторов (ints) в качестве атрибута этого класса. Является ли дружба коммутативной? –

+0

Да, дружба является коммутативной, как в реальных социальных сетях. Я также пытался создать класс Person и читать данные в нем, но я до сих пор не понял, как это сделать. Я могу загрузить свою попытку сделать класс. –

ответ

0

Ваш вопрос является слишком широким имхо, но я дам вам несколько советов:

  1. простейшая структура данных для ключа O (N) доступ - это действительно дикт. Обратите внимание, что dict нуждается в неизменяемых значениях в качестве ключей (но это прекрасно, так как ваши идентификаторы являются целыми числами), но могут принимать что-либо как значения. но это работает только для (относительно) небольших наборов данных, поскольку это все в памяти. Если вам нужны большие наборы данных и/или стойкость, вам нужна база данных (ключ: значение, реляционный, документ, выбор зависит от вас).

  2. Python имеет классы и вычисляемые атрибуты

  3. В Python, отсутствие значения является None объектом

  4. есть анализатор csv файлов в стандартном Lib.

Теперь вам просто нужно прочитать документ и начать кодирование.

[править] WRT/фрагмент кода

class People: 

    id = None 
    name = '' 
    surname = '' 
    age = None 
    gender = ['male', 'female'] 
    friends = [] 

Python не Java или PHP. Вы определили атрибуты класса (разделяемые всеми экземплярами класса), вам нужны атрибуты экземпляра (определенные в методе __init()). Вы должны действительно read the FineManual.

Также, если вы используете Python 2.7.x, вы хотите, чтобы ваши классы наследовали от object (исторические причины).

Так что ваш Person класс должен выглядеть примерно так:

class Person(object): 
    def __init__(self, id, name, surname, age, gender, friends=None): 
     self.id = id 
     self.name = name 
     self.surname = surname 
     self.age = age 
     self.gender = gender 
     self.friends = friends or [] 

, а затем создать Person экземпляр:

person = Person(42, "John Cleese", "Archie Leach", 77, "male", [11, 1337)]) 




def is_friend(id1, id2): 
    if (id1 in People.friends) & (id2 in People.friends): 
     return True 

Несколько точек указывает здесь:

Во-первых: вы либо хотите переименовать эту функцию are_friendsили сделать это методом e Person, а затем передать только один (0) Person экземпляр (а не 'id') в качестве аргумента.

Второй: в Python, & - побитовый оператор. Логический оператор «и» пишется, ну, and.

В-третьих: выражение имеет значение истины само по себе, поэтому ваш оператор if является избыточным. Всякий раз, когда вы видите что-то вроде:

def func(): 
    if <some expression>: 
     return True 
    else: 
     return False 

вы можете просто переписать его как:

def func(): 
    return <some expression> 

Или, если вы хотите, чтобы func возвращает правильное логическое (True или False):

def func(): 
    return bool(<some expression>) 

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

+0

Благодарим за отзыв. Файл, который я использую, невелик, у него всего 20 человек, поэтому я считаю, что это не такая трудная задача. Сначала я попытался использовать класс, но не мог получить больше, потому что нехватка знаний. Я попробую csv lib, спасибо. –

+0

Класс должен состоять в моделировании лица. Вы бы сохранили экземпляры этого класса в dict (20 записей - это набор данных для игрушек, чтобы вы действительно нуждались в чем-то еще). Вы можете инкапсулировать этот dict в объект PersonRepository, ответственный за заполнение dict из файла csv и поиск лиц по идентификатору. Это составляет вашу модель домена. Тогда вам просто нужно написать ui (текст, командную строку, сеть или что-то еще), чтобы использовать эту модель, и все готово. –

+0

Кому я могу загрузить данные в словарь, если он принадлежит классу? Как использовать атрибуты словаря?Я пытался сделать это, но никакие данных не были прочитаны: класс люди: людей = { 'ID': Нет, 'имя' : '', 'фамилии': '', 'возраста': Нет, 'пол': [ 'мужской', 'женский'], 'друзья': [] } ППЛ = {} People.ppl = открыт (г "data.txt", 'г') люди. read() print (People.person) –