<p>@abarnert:它从您的博客中派生出以下代码:分组为相邻值的运行(链接:<a href="http://stupidpythonideas.blogspot.com/2014/01/grouping-into-runs-of-adjacent-values.html" rel="nofollow">http://stupidpythonideas.blogspot.com/2014/01/grouping-into-runs-of-adjacent-values.html</a>)</p>
<p>我尝试了Win7中的python2.6.6和centos6.5中的python2.6.6,问题是一样的。因为没有itertools.cmp_到\u键()在这个Python2.6中,我修改了您的代码,希望问题不是来自我的修订。在</p>
<pre><code>def adjacent_cmp(x, y):
if x+1 < y: return -1
elif x > y: return 1
else: return 0
def cmp_to_key(mycmp):
'Convert a cmp= function into a key= function'
class K:
def __init__(self, obj, *args):
self.obj = obj
def __lt__(self, other):
return mycmp(self.obj, other.obj) < 0
def __gt__(self, other):
return mycmp(self.obj, other.obj) > 0
def __eq__(self, other):
return mycmp(self.obj, other.obj) == 0
def __le__(self, other):
return mycmp(self.obj, other.obj) <= 0
def __ge__(self, other):
return mycmp(self.obj, other.obj) >= 0
def __ne__(self, other):
return mycmp(self.obj, other.obj) != 0
return K
class groupby:
# [k for k, g in groupby('AAAABBBCCDAABBB')] > A B C D A B
# [list(g) for k, g in groupby('AAAABBBCCD')] > AAAA BBB CC D
def __init__(self, iterable, key=None):
if key is None:
key = lambda x: x
self.keyfunc = key
self.it = iter(iterable)
self.sentinel = self.tgtkey = self.currkey = self.currvalue = object()
def __iter__(self):
return self
def next(self):
while (self.currkey is self.sentinel
or self.tgtkey is not self.sentinel
and self.tgtkey == self.currkey):
self.currvalue = next(self.it) # Exit on StopIteration
self.currkey = self.keyfunc(self.currvalue)
self.tgtkey = self.currkey
return (self.currkey, self._grouper(self.tgtkey))
def _grouper(self, tgtkey):
while tgtkey is self.sentinel or tgtkey == self.currkey:
yield self.currvalue
self.currvalue = next(self.it) # Exit on StopIteration
tgtkey, self.currkey = self.currkey, self.keyfunc(self.currvalue)
adjacent_key = cmp_to_key(adjacent_cmp)
a = [0, 1, 2]
print [list(g) for k, g in groupby(a, adjacent_key)]
[[0, 1, 2], [2]]
</code></pre>