计算列表中其他元素之间的特定元素的数量

时间:2015-12-21 18:01:22

标签: python list between

我正在读一个数据文件。行以连续数字(步骤)开始,有时在每行之间有一个0。

E.g:

1
0
2
0
3
4
5
0
0
0
6
0

如何创建一个列表,计算每一步之间的0的数量。

我想要一个这样的列表:

finalList = [1,1,0,0,3,1]

表示每个步骤包含的0的数量,即:步骤1具有1个零,步骤2具有0个零,步骤3具有0个零,步骤4具有0个零,步骤5具有3个零,步骤6具有1个零

5 个答案:

答案 0 :(得分:3)

如果您的数据文件看起来与您描述的完全一致,则以下代码应该有效(例如,除了增加步数和零之外没有其他数字)。

cur = 0
res = []
with open("file.txt") as f:
    for line in f:
        if line.strip() == '0':
            cur += 1
        else:
            res.append(cur)
            cur = 0

答案 1 :(得分:2)

a = [1,0,2,0,3,4,5,0,0,0,6,0]
finalList = []
count = 0
for i in xrange(len(a)):
    if i == 0 : continue
    if a[i] == 0 :
        count += 1
    else : 
        finalList.append(count)
        count = 0
finalList.append(count)

答案 2 :(得分:2)

使用Python的电池可能过于聪明的解决方案:

from itertools import chain, groupby

with open("file.txt") as f:
    # Add extra zeroes after non-zero values so we see a group when no padding exists
    extrazeroes = chain.from_iterable((x, 0) if x else (x,) for x in map(int, f))

    # Count elements in group and subtract 1 if not first group to account for padding
    # The filter condition means we drop non-zero values cheaply
    zerocounts = [sum(1 for _ in g) - bool(gnum) for gnum, (k, g) in enumerate(groupby(extrazeroes)) if k == 0]

    # If leading zeroes (before first non-zero line) can't happen, simplify to:
    zerocounts = [sum(1 for _ in g) - 1 for k, g in groupby(extrazeroes) if k == 0]

是的,它有点复杂(如果你不关心在两个非零值之间没有间隙的情况下包括零那么它会更简单),但它简洁明了应该非常快。如果您可以省略计数中的0,那么它将简化为更清晰:

with open("file.txt") as f:
    zerocounts = [sum(1 for _ in g) for k, g in groupby(map(int, f)) if k == 0]

为了记录,如果符合要求,我会使用后者。前者应该不会出现在生产代码中。 : - )

请注意,根据您的使用情况,使用groupby可能是您更广泛问题的好主意;在评论中,您提到您将所有行存储在文件中(使用f = f.readlines()),这意味着您可能会根据zerocounts中存储的值访问它们。如果您有特殊需要处理每个"步骤"根据以下零的数量,上面代码的改编可以节省​​你通过懒惰分组和处理来诋毁文件的内存开销。

注意:为了避免将整个文件压入内存,在Python 2中,您要添加from future_builtins import map,因此map是一个惰性生成器函数,如它位于Py3中,而不是加载整个文件并将其全部转换为int。如果您不想踩踏map,则itertools.imap转换map int以进行.pop转换即可实现相同的目标。

答案 3 :(得分:1)

我想出了这个:

finalList = []
count = 0
step = None

for e in [1, 0, 2, 0, 3, 4, 5, 0, 0, 0, 6, 0]:
   if e > 0:
      if step:
         finalList.append(count)
      step = e
      count = 0
   else:
      count += 1
if step:
    finalList.append(count)

答案 4 :(得分:0)

替代解决方案

# temp list (copy of l with last element if doesn't exist)
_l = l if l[-1] > 0 else l + [max(l) + 1]
# _l.index(i) - _l.index(i - 1) - 1 = distance between elements
[_l.index(i) - _l.index(i - 1) - 1 for i in range(2, max(_l) + 1)]