<p>可以交换元组的顺序以创建映射:</p>
<pre><code>d1 = dict(x[::-1] for x in list1)
d2 = dict(x[::-1] for x in list2)
d3 = dict(x[::-1] for x in list3)
</code></pre>
<p>现在可以对键进行并集,因为<code>dict.keys</code>返回类似<code>set</code>的对象:</p>
<pre><code>keys = d1.keys() | d2.keys() | d3.keys()
</code></pre>
<p>其余的可以通过<code>dict.get</code>完成:</p>
<pre><code>result = {k: d1.get(k, 1) + d2.get(k, 1) + d3.get(k, 1) for k in keys}
</code></pre>
<p>将其转换为排序列表非常简单:</p>
<pre><code>sorted(x[::-1] for x in result.items())
</code></pre>
<p>假设您的列表现在位于元列表中:</p>
<pre><code>lists = [list1, list2, list3]
keys = set().union(*lists)
dicts = [dict(x[::-1] for x in l) for l in lists]
result = {k: sum(d.get(k, 1) for d in dicts) for k in keys}
result = sorted(x[::-1] for x in result.items())
</code></pre>
<hr/>
<p>下面是一个稍微简单的解决方案:</p>
<pre><code>mapping = dict.fromkeys(set().union(*lists), len(lists))
for v, k in itertools.chain.from_iterable(lists):
mapping[k] += v - 1
result = sorted(x[::-1] for x in result.items())
</code></pre>
<hr/>
<p>您可以使用<code>collections.Counter</code>为您完成大部分数学运算:</p>
<pre><code>c = Counter()
for lst in lists:
c.update({k: v - 1 for v, k in lst})
result = [(v + len(lists), k) for k, v in c.items()]
</code></pre>
<p>正则<code>collections.defaultdict</code>的相同之处是:</p>
<pre><code>d = defaultdict(int)
for v, k in itertools.chain.from_iterable(lists):
d[k] += v - 1
result = [(v + len(lists), k) for k, v in d.items()]
</code></pre>