WedX - журнал о программировании и компьютерных науках

Выполнение поиска по идентификатору в списке друзей в Python

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

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

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

пол может быть "мужской" или "женский",

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

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

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

У меня есть некоторые идеи, но я не уверен, как это реализовать, так как я еще недостаточно знаю 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()

  • Добро пожаловать в SO, вы обнаружите, что сообщество очень готово помочь, если вы сможете показать, что вы пробовали и на чем застряли. Модуль csv поможет вам прочитать ваши данные, и вам следует подумать о подходящих структурах данных для вашей информации. 12.12.2016
  • Я бы создал класс Person, а затем просто сделал бы их друзей набором идентификаторов (ints) в качестве атрибута этого класса. Является ли дружба коммутативной? 12.12.2016
  • Да, дружба коммутативна, как и в настоящих социальных сетях. Я также пытался создать класс Person и считывать в него данные, но так и не научился это делать. Я могу загрузить свою попытку сделать класс. 12.12.2016

Ответы:


1

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

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

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

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

  4. в стандартной библиотеке есть парсер csv файлов.

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

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

class People:

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

Python — это не Java или PHP. То, что вы определили выше, - это атрибуты класса (общие для всех экземпляров класса), вам нужны атрибуты экземпляра (определенные в методе __init()). Вам действительно следует прочитать 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 или сделать ее методом класса Person, а затем передать только (один) экземпляр 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 и, возможно, какое-то полное руководство для начинающих.

12.12.2016
  • Спасибо за ответ. Используемый мной файл небольшой, в нем всего 20 человек, так что я считаю, что это не такая уж сложная задача. Сначала я пытался использовать класс, но не смог продвинуться дальше из-за недостатка знаний. Я попробую с csv lib, спасибо. 12.12.2016
  • Класс здесь будет моделировать сущность «человек». Вы должны хранить экземпляры этого класса в dict (20 записей - это игрушечный набор данных, поэтому вам действительно нужно что-то еще). Вы можете захотеть инкапсулировать этот dict в объект PersonRepository, отвечающий за заполнение dict из CSV-файла и поиск людей по идентификатору. Это составляет вашу доменную модель. Затем вам просто нужно написать пользовательский интерфейс (текст, командная строка, сеть или что-то еще), чтобы использовать эту модель, и все готово. 12.12.2016
  • Кому я могу загрузить данные в словарь, если они принадлежат классу? Как тогда использовать атрибуты словаря? Я пытался это сделать, но данные не были прочитаны: class People: person = {'id' : None, 'name' : '', 'surname' : '', 'age' : None, 'gender' : [' мужчина», «женщина», «друзья»: [] } ppl = {} People.ppl = open(rdata.txt, 'r') People.read() print (People.person) 13.12.2016
  • Эээ... Я думаю, вам придется узнать об ООП в целом и о том, как это работает в Python. 14.12.2016
  • Мне удалось создать класс и загрузить файл, и теперь я пытаюсь понять, как сделать эту функцию. Вот что я сделал: 26.12.2016
  • ` def is_friend(id1, id2): p.id = id1 # для id2 в p.friends: if str(id2) в p.friends: #print(p) return True иначе: return False ` 27.12.2016
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]