<p>我提议制定以下准则:</p>
<pre><code>raw_data='''
82 68 86 94 89 63 77 76 84 89
75 78 81 82 76 99 80 84 89 88
60 83 72 83 85 56 86 68 75 100
90 84 75 86 74 77 95 63 80 76
100 43 76 81 79 74 96 52 69 86'''
tu = (0,60,70,80,90,100)
print raw_data
print tu
from collections import OrderedDict
tu0 = tu[0]
tuL = tu[-1]
tuF = tu[1:]
d = OrderedDict((tu[i], [tu[i-1:i+1]])
for i in xrange(1,len(tu)))
for x in map(int,raw_data.split()):
if x>=tu0:
if x==tuL:
d[tuL].append(x)
else:
for lim in tuF:
if x<lim:
d[lim].append(x)
break
print
print '\n'.join('%-15s%s' % (d[k][0],len(d[k])-1) for k in d)
</code></pre>
<p>结果</p>
^{pr2}$
<p>一。在</p>
<h3>编辑</h3>
<p>我对算法中的这些<code>if</code>、<code>for</code>、<code>else</code>和{<cd4>}都不满意。<br/>
所以我给出了一个新的代码,我认为这是一个改进,因为它更简短、更清晰。我觉得它也更快,但我没有测试速度。在</p>
<p>困难在于,当原始数据中的一个数字等于极限序列<code>tu = (0,60,70,80,90,100)</code>的最后一个值(样本中为100),这个数字必须被计算为属于最后一个跨度,这里是样本中的<code>[90,100]</code>(数学表示法),而前面的跨度如<code>[0,60[</code>,<code>[60,70[</code>。。。不包括上限。<br/>
但是我最终找到了正确的测试<code>x==tuLast==lim</code>来保存这个特定的情况,然后能够使用一个生成器来代替以前可怕的算法,它有几个测试<code>if</code>和一个循环。在</p>
<p>以下代码在Python3中是可执行的。在</p>
<pre><code>raw_data='''
82 68 86 94 89 63 77 76 84 89
75 78 81 82 76 99 80 84 89 88
60 83 72 83 85 56 86 68 75 100
90 84 75 86 74 77 95 63 80 76
100 43 76 81 79 74 96 52 69 86'''
tu = [0,60,70,80,90,100]
print( 'raw_data :%s\n\ntu :\n%s' % (raw_data,tu),'\n' )
tu0, tuLast = tu[0], tu[-1]
tu_from1 = tu[1:]
from collections import OrderedDict
d = OrderedDict( (two[1],[two]) for two in zip(tu, tu_from1) )
print ('OrderedDictionary , before:\n%s'
% '\n'.join('key:%3s value:%s' % item for item in d.items()))
# the core of the code is here:
for x in (x for x in map(int,raw_data.split()) if x>=tu0):
d[next(lim for lim in tu_from1
if x<lim or x==tuLast==lim)].append(x)
print ('\nOrderedDictionary , after:\n%s'
% '\n'.join('key:%3s value:%s' % item for item in d.items()),'\n')
print( '\n'.join('%-15s%s' % (v[0],len(v)-1) for v in d.values()) )
</code></pre>
<p>结果</p>
<pre><code>raw_data :
82 68 86 94 89 63 77 76 84 89
75 78 81 82 76 99 80 84 89 88
60 83 72 83 85 56 86 68 75 100
90 84 75 86 74 77 95 63 80 76
100 43 76 81 79 74 96 52 69 86
tu :
[0, 60, 70, 80, 90, 100]
OrderedDictionary , before:
key: 60 value:[(0, 60)]
key: 70 value:[(60, 70)]
key: 80 value:[(70, 80)]
key: 90 value:[(80, 90)]
key:100 value:[(90, 100)]
OrderedDictionary , after:
key: 60 value:[(0, 60), 56, 43, 52]
key: 70 value:[(60, 70), 68, 63, 60, 68, 63, 69]
key: 80 value:[(70, 80), 77, 76, 75, 78, 76, 72, 75, 75, 74, 77, 76, 76, 79, 74]
key: 90 value:[(80, 90), 82, 86, 89, 84, 89, 81, 82, 80, 84, 89, 88, 83, 83, 85, 86, 84, 86, 80, 81, 86]
key:100 value:[(90, 100), 94, 99, 100, 90, 95, 100, 96]
(0, 60) 3
(60, 70) 6
(70, 80) 14
(80, 90) 20
(90, 100) 7
</code></pre>