擅长:python、mysql、java
<p>itertools是最好的解决方案,但是对于没有导入的另一种方法,我们可以使用dict:</p>
<pre><code>od = {}
prev = None
out = []
for ele in l:
if ele != prev and prev in od:
out.extend((prev, od[prev])) if od[prev] > 1 else out.append(prev)
od[prev] = 0
od.setdefault(ele, 0)
od[ele] += 1
prev = ele
out.extend((ele, od[ele])) if od[ele] > 1 else out.append(ele)
print(out)
[3, 6, 100, 1, 6, 200, 3, 3, 100, 1, 3]
</code></pre>
<p>或者在使用更高效的<code>defaultdict</code>的函数中,在dict中存储数据需要更多内存,但使用groupby可能是更快的解决方案:</p>
^{pr2}$
<p>有趣的是,这是一个很好的速度,可能是因为我们不必循环每个子列表来获得len:</p>
<pre><code>In [33]: l = [choice(l) for _ in range(100000)]
In [34]: timeit grp1(l)
10 loops, best of 3: 23.9 ms per loop
In [35]: timeit list(solve(l))
10 loops, best of 3: 33.9 ms per loop
In [36]: list(solve(l)) == grp1(l)
Out[36]: True
</code></pre>