根据某些属性合并对象并合并(加和)某些其他属性

时间:2018-09-27 15:11:47

标签: python python-3.x merge

假设我有def validate4(username,password): con = sqlite3.connect('static/Users.db') with con: cur = con.cursor() cur.execute("SELECT * FROM Nbc") users = cur.fetchall() for user in users: dbUser = user[0] dbPass = user[1] if dbPass == password: completion=(dbUser, username) return users @app.route('/nbc', methods=['GET', 'POST']) def nbc(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] users= validate4(username,password) return render_template('nbc.html', users=users) else: flash ( 'Invalid Credentials. Please try again.') return render_template('nbc.html') ,属性为<html lang="en"> <head> <link rel="stylesheet" href="/static/event.css" type="text/css"> </head> <body> <form action="/nbc" method="POST"> <div class="login"> <div class="login-screen"> <div class="app-title"> <h1>Login</h1> </div> <div class="login-form"> <div class="control-group"> <input type="text" class="login-field" placeholder="username" name="username" value="{{ request.form.username }}"> <label class="login-field-icon fui-user" for="login-name"></label> </div> <div class="control-group"> <input type="password" class="login-field" placeholder="password" name="password" value="{{ request.form.password }}"> <label class="login-field-icon fui-lock" for="login-pass"></label> </div> <input type="submit" value="Log in" class="btn btn-primary btn-large btn-block"> <br> <div id="navbar" class="app-titl"> <a class="nav navbar-nav"></a> <li class="active"><a href="{{ url_for('index') }}">Home</a></li> <a href="{{ url_for('index') }}"></a> </div> </div> </div> </div> </form> {% if users%} <div class="table"> <table> {%for user in users%} <ul style="list-style-type:disc"> <li>{{user[2]}}</li> <li>{{user[3]}}</li> <li>{{user[4]}}</li> </ul> {%endfor%} </table> </div> {%endif%} </body> </html> MyObjectattr_aattr_b

如果它们具有相同的attr_cquantity.attr_a

,我想合并它们的数量。

这是一个例子,也是我的方法。有一个更好的方法吗?例如;如果我想在合并列表后保留列表的顺序怎么办?

attr_b

1 个答案:

答案 0 :(得分:2)

好吧,我认为针对特定用例“定制” __eq__等不是一个好主意:现在,这意味着MyObject("AAA", "BBB", "A123", 1000)被认为等于{{1} }。对于将这些对象“合并”在一起的用例,这可能会起作用,但这意味着其他(直接)用例可能会导致很多额外的逻辑。

我要避免的另一件事是更改现有的MyObject("AAA", "BBB", "A123", 1425)的数量:您不知道指向该对象的变量是什么。结果,这可能意味着突然包含MyObject的列表具有MyObject不同的列表。

实现像quantities这样的功能可能会更好:

get_key

然后我们执行或多或少相似的算法,但是我们构造了新的class MyObject: def __init__(self, attr_a, attr_b, attr_c, quantity): self.attr_a = attr_a self.attr_b = attr_b self.attr_c = attr_c self.quantity = quantity def get_key(self): return (self.attr_a, self.attr_b, self.attr_c) def __repr__(self): return "<{}, {}, {}, {}>".format(self.attr_a, self.attr_b, self.attr_c, self.quantity)

MyObject

使用某种from collections import defaultdict res = defaultdict(int) for obj in objs: res[obj.get_key()] += obj.quantity result = [MyObject(*k, v) for k, v in res.items()] 函数将clone与新数量一起复制也可以改善代码设计。