【问题标题】:Looping through a list of object/values, remove duplicates, and return unique value in View (python)遍历对象/值列表,删除重复项,并在视图中返回唯一值(python)
【发布时间】:2016-05-28 06:46:05
【问题描述】:

我试图更好地理解一些编程概念并将其付诸实践,特别是通过包含值的列表进行循环和递归(或迭代??)。我有一个从数据库中检索列表并打印表实体及其元素的 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,而不是3下指定的所有微序列)名称subseries:3a、3b、3c、3d)。这里的目标是在模板中显示单个微序列(它只是一个,所以不要让这里的复数名称混淆你),以便用户可以单击它并进入扩展的微序列 (subseries) 视图 (3a , 3b, 3c ....)。

餐桌布置:
评估
|--名称
|--正文
|--微系列
|--子系列

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

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

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


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}

数据库表:

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

【问题讨论】:

  • 你能否在问题中添加模型代码,否则它有点猜测正在发生什么以及应该发生什么?
  • 听起来最简单的方法是拥有一个包含 {microseries.id: microseries instance} 对的字典,然后返回 dict.values()
  • 嗨@MikkoOhtamaa。我添加了更多我认为可能对每个人都有帮助的代码。

标签: list python-2.7 duplicates iteration pyramid


【解决方案1】:

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

【讨论】:

  • 除了dict,如果包含的对象支持这一点,您还可以使用更高效的set。见set.add()。我不确定 SQLAlchemy 模型是否支持。
  • @MikkoOhtamaa set() 确实有效并且速度很快。我该怎么做 set() 而不是 dict[] ?最后一件事,View 代码是在使用 dict 还是在不良实践中设置?
  • @thesayhey:您可能可以构建一个 SQLAlchemy 查询,该查询使用一行代码直接返回您想要的内容。然而,这是另一个问题,并不特定于 Pyramid 或他们的观点。
  • 回溯错误:_requestonly_view response = view(request) File "/Users/ack/code/venv/WEB/web/views/default.py", line 274, in view_unique_assessments if x['microseries'] in assessments_by_mircoseries: TypeError: 'Assessment' object has no attribute '__getitem__'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
相关资源
最近更新 更多