【问题标题】:Making a search by ID in friends list in Python在 Python 中的好友列表中按 ID 进行搜索
【发布时间】:2016-12-14 20:39:19
【问题描述】:

我是 Python 新手,目前正在寻找实习或工作。我目前正在使用 Python 编写一个程序,该程序读取包含此形状数据的文件:

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

Idage为正整数,

性别可以是“男”或“女”,

and friends 是一个数字数组,以逗号分隔,代表与当前人为好友的人的Id。如果 Person1 是 Person2 的朋友,则反之亦然。

正如你在上面的例子中看到的,一个“Person”的属性是用分号分隔的,诀窍是不是每个人都有所有的属性,当然,它们的不同之处在于朋友的数量。因此,任务的第一部分是编写一个程序来读取文件并创建一个结构,该结构表示具有上述属性的人员列表。我必须通过 ID 搜索那些人。

第二部分是创建一个带有两个参数 (Id1, Id2) 的函数,如果具有 Id2 的人是具有 Id1 的人的朋友,则返回 True。否则,它返回 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()

【问题讨论】:

  • 欢迎来到 SO,如果您能展示您的尝试和坚持的内容,您会发现社区非常愿意提供帮助。 csv 模块将帮助您读取数据,您应该考虑适合您的信息的数据结构。
  • 我会创建一个 Person 类,然后让他们的朋友成为一组 id(整数)作为该类的属性。友谊是可交换的吗?
  • 是的,友谊是可交换的,就像在真正的社交网络上一样。我也尝试过创建一个 Person 类,并将数据读入其中,但我仍然没有学会如何去做。我可以上传我的课程尝试。

标签: python search structure social-networking readfile


【解决方案1】:

恕我直言,你的问题太宽泛了,但我会给你一些提示:

  1. O(n) 密钥访问的最简单数据结构确实是一个字典。请注意,dict 需要不可变的值作为键(但这很好,因为您的 Id 是整数),但可以将任何值作为值。但这仅适用于(相对)较小的数据集,因为它都在内存中。如果您需要更大的数据集和/或持久性,则需要一个数据库(键:值、关系、文档,由您选择)。

  2. Python 有类和计算属性

  3. 在 Python 中,缺少值是 None 对象

  4. 标准库中有一个csv 文件解析器。

现在您只需阅读文档并开始编码。

[编辑] wrt/你的代码sn-p

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 要么使它成为Person类的方法,然后只传递一个(单个)Person实例(不是'id ') 作为参数。

第二:在 Python 中,& 是位运算符。逻辑“and”运算符拼写为and

第三:表达式本身具有真值,因此您的if 语句是多余的。每当您看到类似以下内容时:

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

你可以把它改写为:

def func():
    return <some expression>

或者,如果您想确保 func 返回正确的布尔值(TrueFalse):

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

我会在这里停下来,因为我不打算教你如何编程。您显然需要至少完成完整的官方 Python 教程,并且可能还需要完成一些完整的初学者教程。

【讨论】:

  • 感谢您的回复。我使用的文件很小,只有 20 个人,所以我相信这不是什么难事。起初我尝试过使用课程,但由于缺乏知识而无法进一步学习。我将尝试使用 csv 库,谢谢。
  • 这里的一个类是为“人”实体建模。您可以将此类的实例存储在 dict 中(20 条记录是一个玩具数据集,因此您确实需要更多的东西)。您可能希望将此 dict 封装在“PersonRepository”对象中,该对象负责从 csv 文件填充 dict 并按 Id 查找人员。这构成了您的域模型。然后你只需要编写一个 ui(文本、命令行、web 或其他)来使用这个模型,你就完成了。
  • 如果数据属于某个类,我可以将谁加载到字典中?那么如何使用字典的属性呢?我试图这样做,但没有读取任何数据:类人:人= {'id':无,'姓名':'','姓氏':'','年龄':无,'性别':['男性','女性'],'朋友':[] } ppl = {} People.ppl = open(r"data.txt", 'r') People.read() print (People.person)
  • Err... 我想你必须了解一般的 OOP 以及它在 Python 中的工作原理。
  • 我设法创建了一个类并加载了文件,现在我正试图弄清楚如何实现该功能。这是我所做的:
猜你喜欢
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-19
相关资源
最近更新 更多