在Python中的朋友列表中按ID进行搜索

时间:2016-12-12 14:33:44

标签: python search structure social-networking readfile

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

Id;name;surname;age;gender;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()

1 个答案:

答案 0 :(得分:0)

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

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

  2. Python具有类和计算属性

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

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

  5. 现在你只需阅读文档并开始编码。

    [edit] wrt / your code snippet

    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

    第三:表达式本身具有真值,因此您的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教程,也可能需要一些完整的初学者教程。