擅长:python、mysql、java
<p>这是一个使用<code>collections.defaultdict</code>和集合的解决方案。你知道吗</p>
<p>所需的输出与您所拥有的非常相似,并且可以很容易地进行调整。你知道吗</p>
<pre><code>from collections import defaultdict
results = {
'ben' : ['benj', 'benjamin', 'benyamin'],
'benj': ['ben', 'beny', 'benjamin'],
'benjamin': 'benyamin',
'benyamin': 'benjamin',
'carl': 'karl',
'karl': 'carl',
}
d = defaultdict(set)
for i, (k, v) in enumerate(results.items()):
w = {k} | (set(v) if isinstance(v, list) else {v})
for m, n in d.items():
if not n.isdisjoint(w):
d[m].update(w)
break
else:
d[i] = w
result = {max(v, key=len): v for k, v in d.items()}
# {'benjamin': {'ben', 'benj', 'benjamin', 'beny', 'benyamin'},
# 'carl': {'carl', 'karl'}}
</code></pre>
<p>在第二个循环中操纵<code>v</code>到<code>w</code>的想法归功于@IMCoins。你知道吗</p>
<p><strong>解释</strong></p>
<p>主要有3个步骤:</p>
<ol>
<li>将值转换为一致的集合格式,包括原始字典中的键和值。你知道吗</li>
<li>循环浏览此词典并向新词典添加值。如果存在与某个关键点的交集[即集合不是不相交的],则使用该关键点。否则,添加到通过枚举确定的新密钥。你知道吗</li>
<li>通过将最大长度键映射到值,在最终转换中创建结果字典。你知道吗</li>
</ol>