[英]Merging arrays slices in Python
所以我有一个看起来像这样的字符串:
data="ABCABDABDABBCBABABDBCABBDBACBBCDB"
我从其中随机抽取10个字符切片:
start=int(random.random()*100)
end = start+10
slice = data[start:start+10]
但是我现在要做的是计算根本没有切出的“缝隙”或“孔”的数量。
slices_indices = []
for i in xrange(0,100):
start=int(random.random()*100)
end= 10
slice = data[start:end]
...
slices_indices.append([start,end])
例如,运行几次之后。 我支付了这个金额:
ABCAB DABD ABBCBABABDB C ABBDBACBBCDB
但是留下了两个“缺口”。 有没有一种“ Pythonic”的方法来找到这些缺口的数量? 因此,基本上我正在寻找给定切片索引的count_gaps
函数。
例如以上
count_gaps(slices_indices)
会给我两个
提前致谢
有几个,尽管都涉及一些混乱
您可以将已删除的字符串与原始字符串进行比较,并确定未击中的字符。
但是,这是一种非常round回的方式,并且如果两次在字符串中使用相同的10个字符,将无法正常工作。 例如1234123之类的东西。
更好的解决方案是存储您使用的i的值,然后返回数据字符串,将当前位置与您使用的i的值进行比较(加10)。 如果不匹配,则完成工作。
例如(伪代码)
# Make an array the same length as the string
charsUsed = array(data.length)
# Do whatever
for i in xrange(0,100)
someStuffYouWereDoingBefore()
# Store our "used chars" in the array
for(char = i; char < i+10; char++)
if(char <= data.length) # Don't go out of bounds on the array!
charsUsed[i] = true
然后要查看未使用哪些字符,只需遍历charsUsed数组并计算要计数的内容(连续的间隔等)
编辑以响应更新的问题:我仍将使用上述方法制作“使用了哪些字符”数组。 然后,您的count_gaps()函数只需遍历数组即可“发现”差距
例如(伪...某物。这甚至还不是模糊的Python。但是希望您能理解)。这个想法本质上是看当前位置是否为假(即未使用)以及最后一个位置是否为真(使用),这意味着这是“新”差距的开始。 如果两者都为假,那么我们就在中间,如果两者都为真,那么我们就在“二手”字符串的中间
function find_gaps(array charsUsed)
{
# Count the gaps
numGaps = 0
# What did we look at last (to see if it's the start of a gap)
# Assume it's true if you want to count "gaps" at the start of the string, assume it's false if you don't.
lastPositionUsed = true
for(i = 0; i < charsUsed.length; i++)
{
if(charsUsed[i] = false && lastPositionUsed = true)
{
numGaps++
}
lastPositionUsed = charsUsed[i]
}
return numGaps
}
另一个选择是再次遍历charsUsed数组,并将连续值“分组”到更小的距离,然后计算所需的值...本质上是相同的东西,但是使用了不同的方法。 在这个例子中,我只是忽略了我不想要的组和我要做的组的“其余”,只计算了我们不想要的组和我们要做的组之间的边界。
这有点麻烦,但是我认为设置是可行的方法。 我希望下面的代码可以自我解释,但是如果您不理解某些部分,请告诉我。
#! /usr/bin/env python
''' Count gaps.
Find and count the sections in a sequence that weren't touched by random slicing
From http://stackoverflow.com/questions/26060688/merging-arrays-slices-in-python
Written by PM 2Ring 2014.09.27
'''
import random
from string import ascii_lowercase
def main():
def rand_slice():
start = random.randint(0, len(data) - slice_width)
return start, start + slice_width
#The data to slice
data = 5 * ascii_lowercase
print 'Data:\n%s\nLength : %d\n' % (data, len(data))
random.seed(42)
#A set to capture slice ranges
slices = set()
slice_width = 10
num_slices = 10
print 'Extracting %d slices from data' % num_slices
for i in xrange(num_slices):
start, end = rand_slice()
slices |= set(xrange(start, end))
data_slice = data[start:end].upper()
print '\n%2d, %2d : %s' % (start, end, data_slice)
data = data[:start] + data_slice + data[end:]
print data
#print sorted(slices)
print '\nSlices:\n%s\n' % sorted(slices)
print '\nSearching for gaps missed by slicing'
unsliced = sorted(tuple(set(xrange(len(data))) - slices))
print 'Unsliced:\n%s\n' % (unsliced,)
gaps = []
if unsliced:
last = start = unsliced[0]
for i in unsliced[1:]:
if i > last + 1:
t = (start, last + 1)
gaps.append(t)
print t
start = i
last = i
t = (start, last + 1)
gaps.append(t)
print t
print '\nGaps:\n%s\nCount: %d' % (gaps, len(gaps))
if __name__ == '__main__':
main()
我会使用某种位图。 例如,扩展代码:
data="ABCABDABDABBCBABABDBCABBDBACBBCDB"
slices_indices = [0]*len(data)
for i in xrange(0,100):
start=int(random.random()*len(data))
end=start + 10
slice = data[start:end]
slices_indices[start:end] = [1] * len(slice)
我在这里使用了一个list
,但是如果您的数据很大,则可以使用任何其他适当的数据结构,可能更紧凑。
因此,我们已将位图初始化为零,并用1标记了选定的数据块。 现在我们可以使用itertools
一些东西,例如:
from itertools import groupby
groups = groupby(slices_indices)
groupby
返回一个迭代器,其中每个元素都是一个元组(element, iterator)
。 要仅计算差距,您可以做一些简单的事情,例如:
gaps = len([x for x in groups if x[0] == 0])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.