确定列表中良好数据的开始

我有一个从零开始,具有零星数据的列表,然后
好数据.我定义了数据变态的点
第一个索引,具有至少4个的非零条目
连续的非零数据项(即一周的非零价值
数据).例如,如果我的列表为[0、0、1、0、1、2、3、4、5、6、7、8,
9],我将定义数据的好处是4(1
其次是2、3、4、5).
我有一个简单的算法来识别此更改点,但看起来
原油:有一种更干净,更优雅的方法吗?
flag = true
i = -1
j = 0
而旗帜和我 i += 1
如果是复杂的[i] == 0:
j = 0
别的:
J += 1
如果J == 5:
flag = false
del Rethist [:I-4]
在此先感谢您的帮助
托马斯·飞利浦

# 回答1


我发现的第一个解决方案,在几个医生旁边没有太多测试:
从Itertools Import Islice
def start_good1(alist,good_ones = 4):
"""
可能对Python更有效
4
-1
-1
-1
-1
-1
4
4
0
-1
-1
"""
对于i在Xrange(len(alist) - good_ones + 1)中:
如果全部(islice(alist,i,i+good_ones)):
返回i
返回-1
def start_good2(alist,good_ones = 4):
"""
Psyco也许更有效
4
-1
-1
-1
-1
-1
4
4
0
-1
-1
"""
n_good = 0
对于我,El枚举(alist):
如果alist [i]:
如果n_good == good_ones:
返回我 - good_ones
别的:
n_good += 1
别的:
n_good = 0
如果n_good == good_ones:
返回len(alist) - good_ones
别的:
返回-1
如果__name__ ==" __ -main __":
进口医生
doctest.testmod()
打印"做过\ n"
再见,
# 回答2


抱歉,在Psyco版本中,替换了此行:
对于我,El枚举(alist):
和:
因为我在Xrange(Len(Alist))中:
因为Psyco枚举并不能很好地枚举.
再见,
bearophile
# 回答3


也许会这样做?
重新史= [0、0、1、0、1、2、3、4、5、6、7、8、9]
计数= 0
对于i,d枚举(重新历史):
如果d == 0:
计数= 0
别的:
计数 += 1
如果count == 5:
休息
别的:
提高例外("未找到数据")
重新史=重新史[I-4:]
打印重新史
-MATT
# 回答4


8月26日,4:49*pm,tkp ...@hotmail.com写道:
这是我的尝试:
ll = [0、0、1、0、1、2、3、4、5、6、7、8、9]
i = 0
而(i i += 1
打印我,ll [i:i+5]
##
## 4 [1,2,3,4,5]
##
# 回答5


....如果0不在叛逆[ii:ii+5]中:
.... 休息
好吧,短而甜的程度很优雅...
Emile
# 回答6


8月26日,下午5:49,TKP ...@hotmail.com写道:
带有正则表达式:
导入
hist = [0、0、1、0、1、2、3、4、5、6、7、8、9]
hist_str =''.join(str(i)for I in Hist)
match = re.search(r'[1-9] {5,}',hist_str)
hist = hist [-5:]如果匹配是没有其他历史[match.start():]
或更简洁:
导入
hist = [0、0、1、0、1、2、3、4、5、6、7、8、9]
match = re.search(r'[1-9] {5,}',''.join(in Hist中的i))
hist = hist [-5:]如果匹配是没有其他历史的[match.s 酸():]
汤米·麦克丹尼尔
# 回答7


8月26日,7:23*PM,Emile van Sebille *>>对于ii,枚举中的假人(复杂):
... * *如果0不在rethist中[ii:ii+5]:
... * * * * 休息
*>> del Rethist [:II]
好吧,短而甜的程度很优雅...
埃米尔
这就是医生订购的.谢谢大家,
帮助.
真挚地
托马斯·飞利浦
# 回答8


Matthew Fitzgibbons写道:
这是我建议的,除了"如果计数"测试
如原始条款,应该留在其他条款下,所以我认为
最好的回答;-)
我想到了重复的切片替代方案,但这会有些
慢点.但是,对于偶尔的运行,差异将是微不足道的.
担心Psyco为此问题做什么还为时过早
优化.
我的季度的价值...
tjr
# 回答9


这是一个可以进行迭代到介质的人:
DEF启动(来源):
src = iter(源)
铅= []
对于X中的X:SRC:
如果x:
lead.append(x)
如果Len(Lead)== 5:
返回itertools.chain(铅,SRC)
别的:
铅= []
打印列表(开始([0,0,1,0,1,2,2,3,4,5,6,7,8,9])))))
- 斯科特·戴维·丹尼尔斯(Scott David Daniels)
在周二,2008年8月26日17:04:19 -0700,TDMJ写道:
...
悲伤.如果您建议这是一个认真的建议,而不仅仅是
为了证明这可以做到,这肯定是一个例子:
是锤子,一切看起来都像指甲.
在这种特殊情况下,您的正则"解决方案"给出了错误的结果,
表明您在发布之前没有测试代码.暗示:
re.search(r'[1-9] {5,}'," 123456")
没有返回.
该特定错误的明显修复是使用r'[1-9] {5,5}',但甚至
那将失败.提示:如果一个物品拥有多个数字,会发生什么?
在发布另一个正则解决方案之前,请确保它做正确的事
有了这个:
[0,0,101,0,1002,203,3050,4105,5110,623,777]
- -
史蒂文
# 回答10


data = [0,0,1,0,1,2,3,4,5,6,7,8,9]
def itergood(indata):
indata = iter(indata)
buf = []
而Len(Buf)<4:
buf.append(indata.next())
如果buf [-1] == 0:
buf [:] = []
对于buf中的x:
产量x
对于Indata中的X:
产量x
对于Itergood(数据)中的D:
打印D
# 回答11


8月26日,晚上10:39,TKP ...@hotmail.com写道:
...如果0不在求爱中[ii:ii+5]:
... 休息

这就是医生订购的.谢谢大家,
帮助.
请注意,上面的版本(以及大多数其他发布)失败了
边界案例;查看Bearophile的医生,看看其中一些.
以下是通过所有医生的两个版本:第一个版本
仅适用于列表,并将其修改为适当的工作和第二件作品
对于任意迭代:
def clean_inplace(seq,good_ones = 4):
开始= 0
n = len(seq)
而开始 尝试:end = seq.index(0,start)
除了值:end = n
如果末端> = good_ones:
休息
start = end+1
del seq [:start]
def clean_iter(iToser,good_ones = 4): 从Itertools进口链,iSlice,拿起,下降
迭代=迭代(迭代)
is_zero = float(0).__ eq__
而真:
#将所有零摄取到下一个非零
迭代器= dropwhile(is_zero,迭代器)
#最多``good_ones''non-Zeros
良好=列表(islice(takehile(bool,iterator),good_ones))
如果不好:#迭代器精疲力尽
返回迭代器
如果len(good)== good_ones:
#找到`good_ones`连续的非均方体;
#将它们连接到其余物品并退还给他们
返回链(好,迭代器)
hth,
乔治

# 回答12


8月27日,下午3:00,Gerard Flanagan data = [0,0,1,0,1,2,3,4,5,6,7,8,9]
def itergood(indata):
indata = iter(indata)
buf = []
而Len(Buf)<4:
buf.append(indata.next())
如果buf [-1] == 0:
buf [:] = []
对于buf中的x:
产量x
对于Indata中的X:
产量x
对于Itergood(数据)中的D:
打印d
这似乎是迄今为止任意迭代的最有效效率.与
很少有微观的变化:
来自Itertools进口链
def itergood(indata,good_ones = 4):
indata = iter(indata); get_next = indata.next
buf = []; append = buf.append
而len(buf) next = get_next()
如果下一步:append(下一个)
else:del buf [:]
返回链(Buf,Indata)
$ python -m timeit -s" x = 1000*[0,0,0,1,2,3] + [1,2,3,4];来自
Itergood导入itergood""列表(itergood(x))"
100循环,最佳3:3.09毫秒 /循环
并启用了Psyco:
$ python -m timeit -s" x = 1000*[0,0,0,1,2,3] + [1,2,3,4];来自
Itergood导入itergood""列表(itergood(x))"
1000循环,最佳3:466 USEC每循环
乔治
# 回答13


乔治·萨基斯:
这可能与psyco得分很好;-)
def start_good3(seq,good_ones = 4):
"""
4
-1
-1
-1
-1
-1
4
4
0
-1
-1
"""
n_good = 0
POS = 0
对于El中的EL:
如果el:
如果n_good == good_ones:
返回pos- good_ones
别的:
n_good += 1
elif n_good:
n_good = 0
pos += 1
如果n_good == good_ones:
返回pos- good_ones
别的:
返回-1
再见,
# 回答14


8月27日,4:34*下午,bearophileh ...@lycos.com写道:
这可能与psyco得分很好;-)
def start_good3(seq,good_ones = 4):
* * n_good = 0
* * pos = 0
* *对于EL中的EL:
* * *如果EL:
* * * * *如果n_good == good_ones:
* * * * * * * *返回pos- good_ones
* * * * * * 别的:
* * * * * * * * n_good += 1
* * * * elif n_good:
* * * * * * * * n_good = 0
* * * * POS += 1
* *如果n_good == good_ones:
* * * *返回pos- good_ones
* * 别的:
* * * *返回-1
再见,
熊熊
在那里,那是普通的机器.太多思考
对象,您甚至不能再编写链接列表了,对吗?
# 回答15


8月27日,下午5:34,bearophileh ...@lycos.com写道:
这可能与psyco得分很好;-)
我认为,如果您更新此功能,以便它返回"良好"峰值
它不是开始索引,而是等同于Gerard的解决方案.
乔治
# 回答16


8月2日 7,5:48 PM,Castironpi 在那里,那是普通的机器.太多思考
对象,您甚至不能再编写链接列表了,对吗?
而且您仍然想知道为什么人们会杀死您或认为您是
失败的AI项目...
# 回答17


8月27日,6:14*下午,乔治·萨基斯<乔治·萨克.
而且您仍然想知道为什么人们会杀死您或认为您是
一个失败的AI项目...
只是跳上潮流,乔治.你知道,其他人的
完美地通过了医生.所有运行时间o(n* k)吗?
# 回答18


乔治·萨基斯(George Sakkis)写道:
data = [0、0、1、0、1、2、3、4、5、6、7、8、9] def itergood(indata):indata = iter(indata)buf = [],而len(buf) <4:buf.append(indata.next())如果buf [-1] == 0:buf in buf:buf:buf [:] = [] in buf:in in in in in in in in in in itergood中的x for x for x for xfor d in itergood(data) :打印d

这似乎是迄今为止任意迭代的最有效效率.与
很少有微观的变化:
来自Itertools进口链
def itergood(indata,good_ones = 4):
indata = iter(indata); get_next = indata.next
buf = []; append = buf.append
而len(buf) next = get_next()
如果下一步:append(下一个)
else:del buf [:]
返回链(Buf,Indata)
$ python -m timeit -s" x = 1000*[0,0,0,1,2,3] + [1,2,3,4];来自
Itergood导入itergood""列表(itergood(x))"
100循环,最佳3:3.09毫秒 /循环
并启用了Psyco:
$ python -m timeit -s" x = 1000*[0,0,0,1,2,3] + [1,2,3,4];来自
Itergood导入itergood""列表(itergood(x))"
1000循环,最佳3:466 USEC每循环
乔治
- -
我总是忘记清除列表的" del slice"方法,谢谢.
我认为返回"链"意味着该功能本身并不是一个
发电机.因此,如果Indata的长度小于或相等
到达阈值(good_ones),提高了无人驾驶的停止.
在达到返回声明之前.
G.

# 回答19


8月27日,3:42*下午,乔治·萨基斯(George Sakkis)<乔治·萨克(George.Sak)...
你给了我一个主意 - 也许是一个任意的" lookahead",可能是
有用.我没有在新闻组上看到他们那么多,但是
一次. iow缓冲消费者.您可以检查的东西
固定的下一个元素数量.您可以将其实现为
带有__getItem__方法的迭代器.
例如,未生产:
0
1
5
2
6
这根本有意义吗?
# 回答20


8月27日,上午11:50,史蒂文·d'Aprano cybersource.com.auwrote:
...
悲伤.如果您建议这是一个认真的建议,而不仅仅是
为了证明这可以做到,这肯定是一个例子:
是锤子,一切看起来都像指甲.
在这种特殊情况下,您的正则"解决方案"给出了错误的结果,
表明您在发布之前没有测试代码.暗示:
re.search(r'[1-9] {5,}'," 1234 56")
没有返回.
该特定错误的明显修复是使用r'[1-9] {5,5}',但甚至
那将失败.提示:如果一个物品拥有多个数字,会发生什么?
在发布另一个正则解决方案之前,请确保它做正确的事
有了这个:
[0,0,101,0,1002,203,3050,4105,5110,623,777]
- -
史蒂文
嘿,这比这里的其他许多建议更清楚.太糟糕了
不起作用.这就是为什么您在晚上8点之后不发布的原因在
整天工作.我看到我现在记得的是错误的答案,但是
当时我正处于Brainfart中,出于某种原因
他们是对的.可以通过删除空间来使其工作
" {5,}",在数字之间插入某种标记,并使用
正确的正则表达式以识别在
标记,但我认为我已经在这个线程中说了太多.
汤米·麦克丹尼尔
# 回答21


在2008年8月27日,格林尼治标准时间15:50:14,Steven d'Aprano ...
悲伤.如果您建议这是一个认真的建议,而不仅仅是
为了证明这可以做到,这肯定是一个例子:
是锤子,一切看起来都像指甲.
也许我在这里绊倒了" Res是邪恶的"火焰.反正:
他有一个观点:这个 *可以 *被视为正则问题.只有一个
首先构建字符串的解决方案仅适用于笑或
(可能)快速黑客.缺少的是一个用于列表的RE库
对象,而不仅仅是字符串和Unicode字符串.
不确定这样的图书馆是否值得实施 - 诸如此类的问题
我认为这很少见.
/Jorgen
- -
// jorgen grahn \ x/ snipabacken.se r'lyeh wgah'nagl fhtagn!
# 回答22


8月29日,9:43*AM,Jorgen Grahn 他有一个观点:这个 *可以 *被视为正则问题.只有一个
首先构建字符串的解决方案仅适用于笑或
(可能)快速黑客.缺少的是一个用于列表的RE库
对象,而不仅仅是字符串和Unicode字符串.
不确定这样的图书馆是否值得实施 - 诸如此类的问题
我认为这很少见.
时不时地,您会看到有限状态的建议或包裹
机器---如果如何对值进行比较为字符串,如果
您没有比较字符串?

标签: python

添加新评论