循环遍历对象/值列表,删除重复项,并在View(python)中返回唯一值

时间:2016-02-16 19:56:13

标签: list python-2.7 duplicates iteration pyramid

我试图通过包含值的列表更好地理解并实现一些编程概念,特别是循环和递归(或迭代??)。我有一个api,它从数据库中检索一个列表并打印一个表实体及其元素(例如[<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:3a,3b,3c,3d)下指定的3下的微型数据。这里的目标是在模板中显示单个微缩(它只有一个,所以不要让复数名称混淆你),这样用户就可以点击它并进入扩展的微系列({ {1}})查看(3a,3b,3c ....)。

表格安排:
评估
| --name
| - 文
| - 微生物
| - 子服务

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

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

我使用的是Python 2.7,SQLAlchemy和Pyramid(用于Web框架)

view.py(查看前端代码)

subseries

数据库表:

@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}

API:

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)

1 个答案:

答案 0 :(得分:2)

正如@Mikko建议的那样,通常的方法是使用dict(或有时是一组)来跟踪你在迭代过程中已经看到的项目 - 如果项目已经在dict中你只是跳过并转到下一个。然后使用.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}