这不是标准的分区问题,因为我需要维护列表中元素的顺序.
例如,如果我有一个列表
[1, 6, 2, 3, 4, 1, 7, 6, 4]
Run Code Online (Sandbox Code Playgroud)
我想要两个块,然后分裂应该给
[[1, 6, 2, 3, 4, 1], [7, 6, 4]]
Run Code Online (Sandbox Code Playgroud)
每边17的总和.对于三个块,结果将是
[[1, 6, 2, 3], [4, 1, 7], [6, 4]]
Run Code Online (Sandbox Code Playgroud)
总和12,12和10.
编辑以获得其他说明
我目前将总和除以块的数量并将其用作目标,然后迭代直到我接近该目标.问题是某些数据集会使算法混乱,例如试图将以下内容分成3:
[95, 15, 75, 25, 85, 5]
Run Code Online (Sandbox Code Playgroud)
总和是300,目标是100.第一个块总和为95,第二个总和为90,第三个总和为110,5为"剩余".将它添加到它应该的位置将给出95,90,115,其中更"合理"的解决方案将是110,100,90.
结束编辑
背景:
我有一个包含不同高度的文本(歌词)的列表,我想将文本分成任意数量的列.目前我根据所有线的总高度计算目标高度,但显然这是一致的低估,在某些情况下会导致次优解(最后一列显着更高).
我有一个金字塔网页设置。其中一个观点是这样的:-
sql_list = do_a_query()
handle_a_post_request(request)
return dict(sql_list=sql_list)
def do_a_query():
request.db.query(WhatIAmLookingFor)
Run Code Online (Sandbox Code Playgroud)
(mako,但我认为这无关紧要)模板然后根据 sql_list 中的数据处理显示我的网页。
在handle_a_post_request函数中,我根据发布请求修改会话(并运行 commit())。这些修改显示在结果页面中,这表明查询本身在我的模板中被调用时实际上“运行”或执行。由于我使用的是 mako,因此调用是使用以下方法完成的:-
% for row in sql_list:
<tr>
<td> ${row[0]} </td>
<td> ${row[1]} </td>
<td> ${row[2]} </td>
</tr>
Run Code Online (Sandbox Code Playgroud)
我的结论正确吗?sqlalchemy 查询究竟何时“实现”,以便在那之后对会话的更改不再显示在查询的“结果”中?还是我的理解在某处存在根本性的缺陷?
我担心的是,将来对该do_a_query()函数的更改(例如,在显示之前迭代其结果以进行某些预处理)将改变我的网页的行为。当然,“正确”的答案只是提前行动handle_a_post_request(),但我想先彻底了解正在发生的事情。
如果我没有选择文件而只是点击"提交",我会收到以下错误: -
Invalid pstruct: {'upload': "b'' is not a FieldStorage instance"}
Run Code Online (Sandbox Code Playgroud)
这不是我在变形演示站点上获得的行为,其中将其留空会导致更合理的"必需"错误消息.
使用我自己的验证器如下所示无法解决问题: -
def validate_file(node, value, **kwargs):
if not value:
raise colander.Invalid(node, "Please select a file")
class Schema(colander.MappingSchema):
excel_file = colander.SchemaNode(deform.FileData(),
widget=deform.widget.FileUploadWidget(tmpstore),
validator=validate_file)
Run Code Online (Sandbox Code Playgroud)
我可以看到错误被引发,但是e.render()e是ValidationFailurefrom 的输出form.validate与错误本身不匹配.相关的deform源代码位于"widget.py"中,其中_FieldStorage类检查是否cstruct具有file属性并引发它自己的Invalid异常.
这是执行验证调用的函数(实际上是bog标准的东西),它返回渲染的页面.
def generate_upload_form(request):
form = deform.Form(upload_schema, buttons=('submit',))
if getattr(request, 'POST') and 'submit' in request.POST:
try:
value_dict = form.validate(request.POST.items())
except deform.ValidationFailure as e: # Invalid form
form …Run Code Online (Sandbox Code Playgroud) postgresql_where对于绕过 Postgres 定义唯一性的方式(在我看来是错误的,但显然 SQL 标准定义它)很有用,其中 Null 值始终是唯一的。下面显示了一个典型示例,其中没有任何项目可以具有相同的名称+用途+batch_id 值(由于第二个索引,None/Null 被视为一个唯一值)。
class Item(StoredObject, Base):
batch_id = Column(Integer, ForeignKey('batch.id'))
group_id = Column(Integer, ForeignKey('group.id'))
name = Column(Text, nullable=False)
purpose = Column(Text, nullable=False, default="")
__table_args__ = (
Index('idx_batch_has_value',
'group_id', 'name', 'purpose', 'batch_id',
unique=True,
postgresql_where=(batch_id.isnot(None))),
Index('idx_batch_has_no_value',
'group_id', 'name', 'purpose',
unique=True,
postgresql_where=(batch_id.is_(None))),
)
Run Code Online (Sandbox Code Playgroud)
但是,我希望在两个 id(batch_id 和 group_id)中具有相同的行为,也就是说,没有任何项目可以具有相同的名称+用途+batch_id+group_id 值(None/Null 被认为是 batch_id 和 group_id 中的一个唯一值)。
我可以通过创建一个带有固定 ID(比如 0)的“默认”批处理/组对象来解决这个问题。这意味着我必须确保批处理/组对象存在,不能被删除,并且该 id 不会被重新分配给另一个“真正的”批处理/组对象(更不用说我必须记住使用/编写计算我有多少批次/组的函数时,将所有计数减一)。
可行,我现在就要做,但一定有更好的方法!有没有类似的东西:-
postgresql_where = (batch_id.isnot(None) AND group_id.isnot(None))
Run Code Online (Sandbox Code Playgroud)
这将解决我认为应该在数据库中而不是在我的模型和/或初始化代码中解决的问题。
我通过金字塔使用 SQLAlchemy 访问简单的 sqlite 数据库。
当我构建逐渐复杂的查询时,我收到以下警告:-
SAWarning:方言 sqlite+pysqlite 本身不支持Decimal 对象,SQLAlchemy 必须从浮点转换 - 可能会出现舍入错误和其他问题。请考虑在此平台上将十进制数字存储为字符串或整数,以实现无损存储。
我的一个查询就是这样做的(释义):-
session.query(subquery.c.a*100.0/(subquery.c.b+subquery.c.c))
Run Code Online (Sandbox Code Playgroud)
在本例中,subquery 是子查询的名称,a、b 和 c 是整数。
我没有保存查询结果或运行任何提交,这纯粹是数据提取/查询,因此当出现上述警告时我感到很惊讶。如何忽略此警告而不完全过滤掉它(以防将来我不小心将十进制数据保存到数据库中)?
我已经看到在多个模块中使用 Python 日志记录和类似的推荐使用:-
import logging
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)
在每个模块中。但是我也使用 Kivy 作为前端,它有自己的日志代码。总而言之,Kivy 的日志代码将 logging.root 设置为它自己的类。
这对我来说意味着 Kivy 分配的处理程序不会被我的子模块继承。
我该如何解决这个问题?我什至尝试过手动分配处理程序如下:-
logging.getLogger(my.module.name).addHandler(handler)
Run Code Online (Sandbox Code Playgroud)
它似乎仍然没有出现在我的控制台日志中。显然,我也不希望每个模块都执行上述操作。
编辑
澄清一下,我想将 Kivy 应用程序设置为能够处理使用“推荐”日志方法的模块,而无需对模块代码进行任何更改。
我的项目根目录中有一个“计划”或“待办事项”文件(Python,尽管这与这个特定问题并不真正相关)。该项目的范围很小,我是唯一从事该项目的程序员。
该文本文件仅包含需要完成的任务列表。当报告错误时,我会将其添加到列表中。还有功能请求。该列表的永久特征是“100% 测试覆盖率”等。所有错误/请求都是通过与我直接联系生成的(系统用户面对面,或者可能但很少通过电子邮件)。
这对于天真的单开发单主分支工作流程来说效果很好,但我正在尝试为每个修补程序/功能使用一个分支(以及用于更大事物的开发分支),并且我意识到这似乎并不适用与单个“todo”文件很好地结合在一起。主要是因为问题是,当添加新的bug时,我应该修改哪个分支?
以下是我看到的选项:-
根本不跟踪“todo”文件。
仅在 master 分支中修改“todo”文件。
修改“todo”文件作为任何新分支(修补程序/功能)创建中的第一个操作。
1 似乎并不理想,尤其是当我在多台机器上工作时(哦,我忘了,因为我最近更频繁地使用桌面,这是一个很好的借口)。在这种情况下,也可以将文件保存在 Dropbox 上的某个位置。2 看起来不错,但是如果我要在功能/开发分支中徘徊一段时间,就会增加无意义的变基量。3 可能会让我忘记分支的存在,并且“todo”文件中没有任何提醒来唤起该记忆。
我在这里缺少什么吗?
我在我的根小部件中绑定到 Window.on_key_down 来处理 android 的后退按钮。
ModalView(及其子 Popup)并不是真正的模态,它们根本不处理键盘,因此也没有处理后退按钮。
如果我从 Popup 继承并绑定到返回 True 的 Window.on_key_down,那么我可以从我的继承类中处理后退按钮。在这一点上,我可以在 on_dismiss 中取消绑定或删除小部件(似乎无法使删除可靠地工作,但这不是一个单独的问题)。
问题是这将我在所有屏幕(我使用屏幕管理器)而不是在我的根小部件中对后退按钮的处理分开。所以我正在寻找一种方法来从我的根小部件检查当前是否有任何弹出窗口打开(最好不要遍历小部件树,因为它不会很好地扩展)。请就我在下面考虑的选项以及任何其他建议提出建议:-
在根小部件中初始化了一个弹出小部件,所有屏幕都将在必要时修改/open()。当然,这将需要绑定/取消绑定该弹出窗口的按钮。然后,根小部件可以轻松检查该单个对象以查看其是否打开。
在从弹出窗口小部件继承的类中处理键盘,并在最后解除键盘绑定。将返回按钮处理拆分为多个文件/屏幕的问题,以及在长时间使用应用程序时构建旧的弹出窗口小部件的问题。
???
python ×6
pyramid ×4
sqlalchemy ×3
kivy ×2
algorithm ×1
deform ×1
git ×1
logging ×1
partitioning ×1
popup ×1
postgresql ×1
sqlite ×1
widget ×1