我需要一个可在序列/迭代器/生成器上迭代的滚动窗口(也称为滑动窗口).默认的Python迭代可以被认为是一种特殊情况,窗口长度为1.我目前正在使用以下代码.有没有人有更多的Pythonic,更简洁,或更有效的方法来做到这一点?
def rolling_window(seq, window_size):
it = iter(seq)
win = [it.next() for cnt in xrange(window_size)] # First window
yield win
for e in it: # Subsequent windows
win[:-1] = win[1:]
win[-1] = e
yield win
if __name__=="__main__":
for w in rolling_window(xrange(6), 3):
print w
"""Example output:
[0, 1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
"""
Run Code Online (Sandbox Code Playgroud) 我正在使用带有Scala插件的IntelliJ IDEA 13(社区版).
我最初导入的现有Scala项目build.sbt工作正常.IDEA提取了库依赖项.尽管我已经选中了该auto-import选项,但在初始导入后添加的其他依赖项未被选中.
如何强制IDEA重新加载依赖项build.sbt?
Linux内核是否具有用于内核代码的通用哈希表实现?我知道可以使用链表,红黑树和基数树,但是没有找到对通用哈希表实现的引用,尽管我知道哈希表在核心内核中大量使用.
我有一个Android Eclipse项目和一个关联的Android Test Eclipse项目,检查到了一个subversion存储库.鉴于已签出的工作副本,如何将Android Test项目引入Eclipse工作区?
将Android项目添加到工作区很容易(只需File-> New Project-> Android Project-> From Existing Source,并将其指向svn工作副本中的目录).但是,"新Android测试项目"没有从现有源创建的选项.
匹配过滤器后可以修改日志事件吗?
我有一个Web容器(Jersey),它在ERROR级别记录未捕获的异常.但是,对于服务器(Jetty)抛出的某些异常(EofException),我想将它们记录在较低级别(INFO).
我可以使用与异常类型(EofException)匹配的Logback过滤器完全删除这些消息.但是我没有找到一种支持的方法来修改日志事件,例如,更改日志级别.
我有一个使用嵌入式Jetty作为服务器的REST应用程序.大多数端点需要公开可见(并且内置适当的身份验证),但有一些仅供内部使用.我想避免对这些进行身份验证的开销,而是使用防火墙来限制访问:
外部可见端点在端口10000上提供,外部防火墙保持打开状态.内部可见端点在端口20000上提供,外部防火墙阻止这些端点.
但是,我无法弄清楚如何使用嵌入式Jetty来实现这一点.我已经尝试实例化两个Server对象,一个在端口10000上,注册了相应的servlet处理程序,另一个在端口20000上注册了相应的servlet处理程序.但是,只有第二个启动的服务器实例才能工作; 对由一个主机托管的端点的请求首先导致404响应.
Jetty文档讨论了如何使用*.xml配置执行此操作,但不适用于嵌入式实例.
有什么想法或想法吗?或者是否有更好的方法来实现我之后的内部/外部端点隔离?硬性要求是内部和外部端点都需要在同一个JVM中"运行".
事实证明,问题与使用Guice和Guice-servlets扩展(问题618和635)有关.运行两个嵌入式Jetty实例的工作正常,如James Kingsbery在下面的回答中所述.
Guice使用在服务器上下文中注册的过滤器(GuiceFilter)来获取需要请求范围的依赖注入(DI)的请求以及构建需要DI的servlet和过滤器.不幸的是,它使用静态对象来管理与之关联的servlet和过滤器列表.
在一个典型的设置中,guice-servlet.jar包含GuiceFilter在每个应用程序中,因此由每个应用程序的不同类加载器加载---一切正常.嵌入式Jetty不是这样,基本上所有内容都由默认的系统类加载器加载.
Guice的最新master(commit fbbb52dcc92e)包含一个更新的GuiceFilter对FilterPipeline对象的动态引用(导致问题的静态对象)的支持.不幸的是,注入FilterPipeline实例的构造函数是package-private.因此,要使用它,您需要在com.google.inject.servlet包中公开该构造函数创建一个包装类:
package com.google.inject.servlet;
import com.google.inject.Inject;
public class NonStaticGuiceFilter extends GuiceFilter {
/**
* Do not use. Must inject a {@link FilterPipeline} via the constructor.
*/
@SuppressWarnings("unused")
private NonStaticGuiceFilter() {
throw new IllegalStateException();
}
@Inject
public NonStaticGuiceFilter(FilterPipeline filterPipeline) {
super(filterPipeline);
}
}
Run Code Online (Sandbox Code Playgroud)
要使用此类,请使用ServletModule已安装的注入器创建实例,并将其注册到Jetty Context:
// …Run Code Online (Sandbox Code Playgroud) 是否可以在常量堆栈和堆空间中在State monad中执行折叠?或者是一种不同的功能技术更适合我的问题?
接下来的部分将描述问题和激励用例.我正在使用Scala,但Haskell中的解决方案也受到欢迎.
StateMonad填充堆假设Scalaz 7.考虑一下州Monad的monadic折叠.为了避免堆栈溢出,我们将蹦蹦跳跳.
import scalaz._
import Scalaz._
import scalaz.std.iterable._
import Free.Trampoline
type TrampolinedState[S, B] = StateT[Trampoline, S, B] // monad type constructor
type S = Int // state is an integer
type M[B] = TrampolinedState[S, B] // our trampolined state monad
type R = Int // or some other monoid
val col: Iterable[R] = largeIterableofRs() // defined elsewhere
val (count, sum): (S, R) = col.foldLeftM[M, R](Monoid[R].zero){
(acc: R, x: R) => StateT[Trampoline, S, R] { …Run Code Online (Sandbox Code Playgroud) 我想找到其全名(相对,虽然绝对也很好)的文件匹配给定的正则表达式(即,像glob模块一样,但是对于正则表达式匹配而不是shell通配符匹配).使用find,人们可以这样做,例如:
find . -regex ./foo/\w+/bar/[0-9]+-\w+.dat
Run Code Online (Sandbox Code Playgroud)
当然,我可以使用findvia os.system(...)或者os.exec*(...),但我正在寻找纯Python解决方案.以下代码os.walk(...)与re模块正则表达式相结合是一个简单的Python解决方案.(它不健壮并且错过了很多(不那么角落)角落的情况,但是对于我的一次性目的来说已经足够了,为一次性数据库插入定位特定的数据文件.)
import os
import re
def find(regex, top='.'):
matcher = re.compile(regex)
for dirpath, dirnames, filenames in os.walk(top):
for f in filenames:
f = os.path.relpath(os.path.join(dirpath, f), top)
if matcher.match(f):
yield f
if __name__=="__main__":
top = "."
regex = "foo/\w+/bar/\d+-\w+.dat"
for f in find(regex, top):
print f
Run Code Online (Sandbox Code Playgroud)
但这效率低下.其内容与正则表达式不匹配的子树(例如,./foo/\w+/baz/继续上面的示例)是不必要地走的.理想情况下,这些子树应该从步行中删除; 不应遍历路径名不是正则表达式的部分匹配的任何子目录.(我猜想GNU find实现了这样的优化,但我还没有通过测试或源代码细读来证实这一点.)
有没有人知道基于强大的正则表达式的Python实现find,理想情况下是子树修剪优化?我希望我只是错过了os.path模块或某些第三方模块中的方法.
我使用DefaultHttpClient了ThreadSafeClientConnManager在Android(2.3.x版本)发送HTTP请求到我的REST服务器(嵌入式码头).
在大约200秒的空闲时间后,服务器用[FIN]关闭TCP连接.Android客户端以[ACK]响应.这应该并确实使套接字处于半闭状态(服务器仍在监听,但无法发送数据).
我希望当客户端再次尝试使用该连接时(通过HttpClient.execute),DefaultHttpClient将检测半关闭状态,关闭客户端的套接字(从而发送它的[FIN/ACK]以完成关闭),并打开一个请求的新连接.但是,有一点问题.
相反,它通过半封闭套接字发送新的HTTP请求.只有在发送后才检测到半闭状态,并且套接字在客户端关闭([FIN]发送到服务器).当然,服务器无法响应请求(它已经发送了它的[FIN]),因此客户端认为请求失败并通过新的套接字/连接自动重试.
最终结果是服务器查看并处理请求的两个副本.
有想法该怎么解决这个吗?(我的服务器使用第二个副本执行了正确的操作,但我很恼火有效负载会被传输两次.)
DefaultHttpClient在首次尝试写入新的HTTP数据包时,是否应检测到套接字已关闭,请立即关闭该套接字并启动新的套接字?在服务器发送[FIN]后几分钟内,如何在套接字上发送新的HTTP请求,我感到很困惑.
我正在寻找一种方法来获得类似JQuery的可排序列表(链接),但是其中一些元素位于固定的不可分割位置.
使一些元素不可分割是微不足道的,但是它们的位置不会保持固定,因为它们上方和下方的可拖动元素的数量可以改变.
更具体一点:我按排名顺序列出了10个项目.我希望用户能够通过拖动(可排序列表)来更改某些项目的排名,但不能更改其他冻结元素的排名.标准的JQuery可排序不可分割功能允许通过更改冻结项目上方或下方的元素数量来更改冻结项目的等级.
我已经尝试通过拖动时"交换"列表元素手动执行此操作.即,当列表元素被拖动到非冻结元素上时,交换两个元素的位置.这给出了我想要的语义,但被拖动的项目在其新位置和当前"拖动"位置之间明显地"跳跃".(我希望它保持在当前的拖动位置;只有它在DOM中的位置才会改变.但是当DOM位置改变时,必须重新计算拖动偏移坐标.而且我不知道如何同时执行DOM位置更改并且原子地拖动偏移坐标变化,防止两者之间的重绘.目前,有时在两者之间重绘,并且元素可见(尽管很快)跳跃.)
编辑 这里是一个jsfiddle显示我的手动方法: 链接.玩了一会儿,你会注意到我提到的闪烁/跳跃.