Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python查找缺少的数据索引_Python_Python 2.7 - Fatal编程技术网

使用python查找缺少的数据索引

使用python查找缺少的数据索引,python,python-2.7,Python,Python 2.7,在一维数组缺少数据的情况下,返回索引的最佳方法是什么。缺少的数据用零表示。数据可能确实为零,但不会丢失。我们只想返回一次超过或等于3个位置的数据为零的索引。例如,对于数组[1,2,3,4,0,1,2,3,0,0,0,1,2,3],函数应仅返回第二段的索引,其中有零,而不是第一个实例 这实际上是一个面试问题:)挑战是在一行中最有效地完成任务跟踪当前运行中的零计数。然后,如果至少有三个零的运行结束,则计算索引 def find_dx_of_missing(a): runsize = 3 #

在一维数组缺少数据的情况下,返回索引的最佳方法是什么。缺少的数据用零表示。数据可能确实为零,但不会丢失。我们只想返回一次超过或等于3个位置的数据为零的索引。例如,对于数组[1,2,3,4,0,1,2,3,0,0,0,1,2,3],函数应仅返回第二段的索引,其中有零,而不是第一个实例


这实际上是一个面试问题:)挑战是在一行中最有效地完成任务

跟踪当前运行中的零计数。然后,如果至少有三个零的运行结束,则计算索引

def find_dx_of_missing(a):
    runsize = 3 # 3 or more, change to 4 if your need "more than 3"
    zcount = 0
    for i, n in enumerate(a):
        if n == 0:
            zcount += 1
        else:
            if zcount >= runsize:
                for j in range(i - zcount, i):
                    yield j
            zcount = 0
    if zcount >= runsize: # needed if sequence ends with missing
        i += 1
        for j in range(i - zcount, i):
            yield j
示例:

>>> a = [1,2,3,4,0,1,2,3,0,0,0,1,2,3]
>>> list(find_dx_of_missing(a))
[8, 9, 10]

>>> a = [0,0,0,3,0,5,0,0,0,0,10,0,0,0,0,0]
>>> list(find_dx_of_missing(a))
[0, 1, 2, 6, 7, 8, 9, 11, 12, 13, 14, 15]
编辑:由于您需要一行,因此这里有两个候选项,假设
a
是您的列表,
n
是计算为缺失数据的最小零行:

[v for vals in (list(vals) for iszeros, vals in itertools.groupby(xrange(len(a)), lambda dx, a=a: a[dx]==0) if iszeros) for v in vals if len(vals) >= n]


我的算法遍历并找到零所在的每个位置,然后找到起点和终点,然后查看它是否大于2,如果不是,则删除该起点和终点。但是对于我拥有的很长一行数据,它的效率非常低,而且我必须存储开始-结束点,我确信有更好的方法来做ita=[1,2,3,4,1,1,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0],对于这个数组,它返回的[11,12,13]是不正确的,它应该返回所有不是零的索引,而不仅仅是3如何
[1,2,3,4,0,1,2,3,0,0,0,1,2,3]
匹配任何东西,因为任何地方都没有超过三个连续零的地方?@PadraicCunningham:很好。我看了这个例子,并将他的要求翻译为“三个或更多”,但这一点需要澄清,因为需求与示例不匹配。@混沌:您的问题将通过包含您现有的工作代码得到改进。还要澄清您是否希望运行超过三个零或三个或更多的零。您好,史蒂文,您的回答是正确的,但我相信一定有一种方法可以更有效地做到这一点很显然,也许在一个line@Chaos:我不确定使它成为一个单行程序是否会提高效率,但这里有一个单行程序:
排序({dx代表xrange中的I(len(a)-3)代表xrange(I,I+3)中的dx,如果a[I:I+3]==[0,0,0]})
。我创建一个中间集并对其排序,以消除三个零的重叠运行。(还有,我可以去参加你的工作面试吗?)嗨,史蒂文,这肯定是一个很好的解决方案,但并不完全正确,因为a=[0,0,0,3,0,5,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0],它给出了[0,1,2,6,7,8,9,11,12,13,14],最后缺少15个:)。此外,三个零是硬编码的,如果我们想使其成为n个连续的零呢?这可能更有效,也可能不更有效:
[v表示VAL中的(列表(VAL)表示IS0,VAL表示itertools.groupby(xrange(len(a)),λdx,a=a:a[dx]=0)表示VAL中的v表示len(VAL)>=3]
对于
groupby
版本,将
=3
更改为
=n
。对于另一个版本,如果设置(a[i:i+n])=={0},则将其更改为
排序({dx表示xrange中的i(len(a)-n+1)表示xrange(i,i+n)中的dx)
sorted({dx for i in xrange(len(a)-n+1) for dx in xrange(i, i+n) if set(a[i:i+n]) == {0}})