小编use*_*699的帖子

是否可以使用缓冲区(基于指针)的字符串比较在python 3中进行排序?

考虑排序字符串的所有后缀的问题,其中后缀是从某个索引i到字符串末尾的子字符串.我们可以创建与已排序后缀的起点相对应的索引列表,而不是创建已排序后缀的列表.然后我们可以这样做:

text = ... some text string ...
sortedIndices = sorted([i for i in range(len(text))], 
                       key = lambda i: text[i:])  
Run Code Online (Sandbox Code Playgroud)

这适用于短字符串,但如果字符串足够长,我们将耗尽内存,因为键函数会产生后缀的副本,并且所有键都在一开始就生成.在python 2.7中,有一个灵活的方法,即buffer()函数:

sortedIndices = sorted([i for i in range(len(text))], 
                       key = lambda i: buffer(text, i))  
Run Code Online (Sandbox Code Playgroud)

在这种情况下,键只是指向文本字符串的指针,因此所需的总内存要少得多(O(n)vs O(n*n)).因此,它将使用更长的字符串.这在2.7中工作得很漂亮,但是在3.x中,buffer()函数已经被删除而支持memoryview,这与缓冲区不同--AFAIK--支持基于指针的字符串比较(即,不使用tobytes方法,它创建了一个字符串的副本).我的问题是:有没有办法在python 3.x中做类似的事情?

python python-3.x

8
推荐指数
1
解决办法
320
查看次数

可以使用python字典理解来创建子字符串及其位置的字典吗?

给定一串字符,我想创建一个包含在字符串中的所有n字符子串的字典,其中字典键是子字符串,值是列表.列表的第一个元素是子字符串的出现次数,列表的第二个元素是这些出现的起始位置列表.

例如,使用n=3,字符串'abcdabcxdabc'会生成此字典:

{'abc': [3, [0, 4, 9]], 
 'cda': [1, [2]], 
 'dab': [2, [3, 8]], 
 'bcd': [1, [1]], 
 'cxd': [1, [6]], 
 'bcx': [1, [5]], 
 'xda': [1, [7]]}
Run Code Online (Sandbox Code Playgroud)

下面的代码工作并且是有效的,因为它只遍历字符串一次,但我想知道是否有更优雅和/或更pythonic方式来执行此操作,可能使用字典理解.我对python很新,并且仍在试图弄清楚何时使用理解等有意义(甚至可能).

text = 'abcdabcxdabc'
n = 3
d = {}
for i in range(len(text) - n + 1):
    sub = text[i:i + n]
    if sub in d:
        d[sub][0] += 1
        d[sub][1].append(i)
    else:
        d[sub] = [1, [i]]
print(d)    
Run Code Online (Sandbox Code Playgroud)

更新:感谢所有回复.他们通常证实我怀疑这太复杂了,无法在一次理解中有效地实施(但感谢火山表明如果效率不是一个问题就有可能实现).感谢RemcoGerlich和Ignacio Vazquez-Abrams将我指向defaultdict.我将不得不深入研究这一点.我的计时结果表明,与dict相比,初始化defaultdict会有更多的开销,但是运行时间可能稍微快一点,至少对于这个例子.(时间结果发布在下面单独的评论中.)现在我想知道是否有任何情况下dict优先于defaultdict.还有,感谢Narcolei指点我的timeit功能.

python dictionary dictionary-comprehension

6
推荐指数
1
解决办法
273
查看次数