<p>最简单的方法是使用一个散列映射,订阅数为+1,取消订阅数为-1,然后相应地订阅/取消订阅。使用Python <code>dict</code>、<code>defaultdict</code>或<code>Counter</code>可以很容易地完成这一点。其中每一个都有O(1)的查找,对于n个操作,总复杂度为O(n)。您说顺序无关紧要,但是对于python3.6和更高版本,字典实际上会以它们第一次插入的相同顺序保留条目。你知道吗</p>
<p>我不知道您的操作是如何表示的,所以我只使用<code>"+1"</code>这样的字符串表示“subscribe user 1”。这应该很容易适应你的行动模式。你知道吗</p>
<pre><code>actions = ["+1", "-1", "+2", "+1", "+3", "+4", "-2", "-5"]
# get final (un)subscriptions
from collections import defaultdict
remaining = defaultdict(int)
for what, who in actions:
remaining[who] += +1 if what == "+" else -1
print(remaining) # {'1': 1, '2': 0, '3': 1, '4': 1, '5': -1})
</code></pre>
<p>如果不能有任何“无效”操作(例如取消已取消订阅的用户的订阅),则dict不能保存+1(订阅)、-1(取消订阅)或0(取消订阅)以外的值。如果<em>可以</em>是无效(un)订阅,那么检查当前值并相应地放弃操作就很容易了,例如只需将新值限制为<code>max(-1, min(value, +1))</code>。你知道吗</p>
<p>然后,只需迭代字典中的值,并打印那些留下<code>+1</code>或<code>-1</code>的值:</p>
<pre><code># print remaining (un)subscriptions
for k, v in remaining.items():
if v == +1:
print("subscribe", k)
elif v == -1:
print("unsubscribe", k)
</code></pre>
<p>输出:</p>
<pre><code>subscribe 1
subscribe 3
subscribe 4
unsubscribe 5
</code></pre>