<p>这里不是调试代码,而是一个替代解决方案,它可以为您提供一些不同的方式来思考您的问题</p>
<pre><code># Load the data as given
c2 = [[1,9,11,15,20,3],
[2,29,22,5,21,8 ],
[3,2,30,16,27,2],
[4,21,17,25,6,4],
[5,15,2,18,6,24],
[6,1,18,19,29,4],
[7,30,17,30,18,15],
[8,10,2,6,26,12],
[9,21,30,12,29,14]]
# Convert it to a dictionary where the key is the person, and
# the value is a set of people they requested
c3 = { l[0]: set(l[1:]) for l in c2}
# Now crudely iterate through each person checking if
# they appear in the requests for each person they
# requested.
m = set()
for me,l in c3.items():
for them in l:
if me != them and me in c3.get(them,set()):
# add the pair as a sorted tuple and let the set
# deduplicate
m.add(tuple(sorted([me,them])))
print(m)
</code></pre>
<p>这个输出</p>
<pre><code>{(2, 5), (2, 8), (4, 6)}
</code></pre>
<p>这看起来效率很低,但大多数搜索都是使用set access完成的,set access是常数时间。这些对是作为元组而不是列表添加的,因为它们是不可变的,因此是可散列的(不能将列表放入一个集合中)。你知道吗</p>
<p>这只是让您考虑使用不同的数据结构,以及它们如何显著地改变您的算法选择。你知道吗</p>
<p>一旦你有了头脑,那么整个循环就可以重写为一个集合</p>
<pre><code>m = { tuple(sorted([me,them]))
for me in c3.keys()
for them in c3[me]
if me != them and me in c3.get(them,set())
}
</code></pre>