【问题标题】:How to compare user input to class object data?如何将用户输入与类对象数据进行比较?
【发布时间】:2020-03-03 17:37:07
【问题描述】:

这里是初学者。

我正在尝试了解如何将用户输入数据与预设类数据进行比较。假设class = Person,加上年龄、体重和姓名。

我有两个人,johnsmith = Person(50, 200, "John Smith") tomjones = Person(40, 220, "Tom Jones")

我想提示用户输入名称 Tom,并检查 Person 类的所有“名称”属性。比如,

person = input(print("Insert the person's name: ")) 输入“Tom”,然后返回所有 Tom 的列表供用户选择,或者如果只有一个,请确认用户确实指的是 Tom Jones。

我应该创建一个类似people = [tomjones, johnsmith, (etc)] 的数组,然后以某种方式在其中搜索吗?

请指出正确的方向,谢谢。

【问题讨论】:

  • 首先,您不需要将print 放入您的input。将所有person 数据保存在某种集合中,比如说一个列表。那么你需要做的就是result = [dude for dude in person_list if dude.name == user_input] 当然调整变量名以匹配你的情况
  • 将所有Person 保留在列表中,然后您可以使用for-loop 检查每个Person 中的名称
  • 你为什么不用字典

标签: python


【解决方案1】:

我是否应该创建一个类似数组的 people = [tomjones, johnsmith, (etc)],并以某种方式在其中搜索?

是的。

尽管如果您希望有大量“人员”并且经常查询总是在同一个字段上(例如,您总是按其姓名搜索特定人员),您可能还需要创建一个 索引 加快搜索速度,例如创建一个字典(可能是WeakValueDictionary),它将您的搜索关键字映射到适当的人。

这是因为迭代一个列表既便宜又高效,但遍历整个列表是线性时间 (O(n)),所以如果您的列表非常长并且您经常遍历它,它加起来。建立索引很昂贵(并且需要至少遍历整个列表一次)并且查找设置更多,但设置查找是恒定时间(O(1))。

【讨论】:

    【解决方案2】:

    将您的 Person 类的实例存储在列表中是一种方法。然后,您可以遍历列表以匹配名称。

    例如

    class Person():
    
        def __init__(self, age, weight, name):
            self.age = age
            self.weight = weight
            self.name = name
    
    
    all_persons = []
    all_persons.append(Person(50, 200, "John Smith"))  # add your Person instance to a list
    all_persons.append(Person(40, 220, "Tom Jones"))
    
    name_input = input("Insert the person's name: ")
    
    for person in all_persons:  # loop through list of all Person instances
        if name_input.lower() in person.name.lower():  # lower() to handle case
            # do something with person 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多