Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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 - Fatal编程技术网

Python 查找字符串序列中的间隙

Python 查找字符串序列中的间隙,python,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

我有一个字符串序列-
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\u id会更快。但是填充哈希表的复杂性是什么?最快的方法是什么

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

seq = *the sequence of strings*
n = 2000000

gaps = set(str(i).zfill(7) for i in range(1,n+1)) - set(seq)
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']

如果输入列表已按顺序排列,则可以避免排序的
(尽管危害不大:如果列表已排序,则Python为O(n)。

对于存储200万个整数的序列,可以使用。这里每个位表示一个整数(位数组中该索引的整数)。示例代码:

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

我建议使用int而不是string进行处理,然后在输出中再次使用string

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
j=0
n=2000000
#从字符串创建一个整数列表
foo=[i代表范围内的i(n)]
#创造差距
foo.删除(1)
foo.删除(50)
而jj:
打印“%07d”%j
j+=1
j+=1

虽然它们不是连续的,但它们是否有序?@khachik,@paul yes输入已排序。。。在任何情况下,我可以得到排序,如果它提高了整体性能。。。