找到一系列字符串中的空白

时间:2010-11-26 11:09:23

标签: python

我有一系列字符串 - 0000001, 0000002, 0000003....高达200万。它们不是连续的。意思是有差距。在0000003之后说下一个字符串可能是0000006.我需要找出所有这些空白。在上述情况下(0000004,0000005)。

这是我到目前为止所做的 -

gaps  = list()
total = len(curr_ids)

for i in range(total):
    tmp_id = '%s' %(str(i).zfill(7))
    if tmp_id in curr_ids:
        continue
    else:
        gaps.append(tmp_id)
return gaps

但正如您所猜测的那样,由于我使用的是list,因此速度很慢。如果我使用dict,预先填充curr_ids,它会更快。但填充哈希表的复杂性是多少?什么是最快的方法。

4 个答案:

答案 0 :(得分:10)

您可以对ID列表进行排序,然后仅执行一次:

def find_gaps(ids):
    """Generate the gaps in the list of ids."""
    j = 1
    for id_i in sorted(ids):
        while True:
            id_j = '%07d' % j
            j += 1
            if id_j >= id_i:
                break
            yield id_j

>>> list(find_gaps(["0000001", "0000003", "0000006"]))
['0000002', '0000004', '0000005']

如果输入列表已经按顺序排列,那么你可以避免sorted(尽管它没有什么害处:如果列表,Python的adaptive mergesort是O( n )已经排序了。)

答案 1 :(得分:3)

要存储2百万个整数的序列,您可以使用bitarray。这里每个位表示一个整数(bitarray中该索引的整数)。示例代码:

gaps = []
# bitarray is 0 based
a = bitarray.bitarray(total + 1)
a.setall(False)
for sid in curr_ids:
    a[int(sid)] = True
for i in range(1, total):
    if not a[i]:
        gaps.append('%07d' %(i))
return gaps

答案 2 :(得分:1)

seq = *the sequence of strings*
n = 2000000

gaps = set(str(i).zfill(7) for i in range(1,n+1)) - set(seq)

答案 3 :(得分:0)

我建议把它取而代之而不是字符串进行处理,然后在输出中再次将它作为字符串

j=0
n=2000000
#create a list of int number from your string
foo = [i for i in range(n)]
#creating gaps
foo.remove(1)
foo.remove(50)
while j<n:
    for i in foo:
        if i>j:
            print '%07d'%j
            j+=1
        j+=1