遍历 object/values 的列表,删除重复项,并在视图中 return 唯一值 (python)

Looping through a list of object/values, remove duplicates, and return unique value in View (python)

我试图更好地理解并付诸实践一些编程概念,特别是通过包含值的列表进行循环和递归(或迭代??)。我有一个 api 从数据库中检索列表并打印 table 实体及其元素(例如 [<Assessment(name='teaching', text='something', microseries=3, subseries='3a', etc...)>, <Assessment(name='learning', text='foo', microseries=3, subseries='3b', etc...)>])。此列表中有 1-5 个微型系列。

问题: 删除重复的 microseries 所以输出 (return) 只有一个 microseries (例如只有一个 microseries= 3 而不是名称 subseries 下指定的所有 3 以下的微型系列:3a、3b、3c、3d)。这里的目标是在模板中显示一个微型系列(它只是一个所以不要让这里的复数名称混淆),以便用户可以单击它并进入展开的微型系列 (subseries) 视图(3a、3b、3c ....)。

Table排列:
评价
|--姓名
|--文本
|--微剧
|--子系列

我相信可能有更好的方法来解决这个问题,我很乐意听取一些建议。我是新手,可以使用一些明智的指导来解决这个问题。

我目前正在使用在以前的 Stacks 问题上建议的代码 1, 2 请帮忙 :) 我想更好地理解处理列表迭代和删除重复项并仅返回唯一值的方法背后的概念列表中每个对象的值。请原谅我缺乏技术演讲。

我正在使用 Python 2.7、SQLAlchemy 和 Pyramid(用于网络框架)


view.py(查看前端代码)

@view_config(route_name='assessments', request_method='GET', renderer='templates/unique_assessments.jinja2')
def view_unique_assessments(request):
    # other code
    all_assessments = api.retrieve_assessments()
    #print 'all assessments', all_assessments

    new_list = list(set(all_assessments)) #removes duplicates
    new_list.sort() #sorts items in list
    print 'new list', new_list # sorted and unique list

    for x in new_list:
        print 'test', x #prints test <Assessment(name='Foo', text='this is 1A', microseries='1', etc...)>    

        micro = set([x.microseries]) #doesn't work 
        print 'test micro single print', micro #doesn't iterate over the list and print out each unique microseries -- only prints one
        #prints: test micro single print set([3]) instead of 1,2,3,4,5

    return {'logged_in': logged_in_userid, 'unique_microseries': micro}

数据库Table:

class Assessment(Base):
    __tablename__ = 'assessments'

    id = Column(Integer, primary_key=True)
    name = Column(String(50), unique=True)
    text = Column(String(2000))
    microseries = Column(Integer)
    subseries = Column(String(50))
    created_on = Column(DateTime, default=datetime.utcnow)

API:

def retrieve_assessments(self):
    assessments = self.session.query(Assessment).order_by(Assessment.id).all()
    return assessments

正如@Mikko 所建议的那样,通常的方法是使用字典(有时是集合)来跟踪您在迭代期间已经看到的项目——如果该项目已经在字典中,您只需跳过并去下一个。然后你使用 .values() 方法来获取字典的错误值。

def view_unique_assessments(request):
    all_assessments = api.retrieve_assessments()
    assessments_by_microseries = {}

    for x in all_assessments:     
        if x.microseries in assessments_by_microseries:
            print("Already seen this microseries: %s" % x.microseries)
        else: 
            assessments_by_miniseries[x.microseries] = x

    unique_assessments = sorted(assessments_by_microseries.values())     
    return {'logged_in': logged_in_userid, 'unique_assessments': unique_assessments}