<p>你几乎不想在列表中使用<code>index</code>。在迭代时跟踪您所在的位置;不要试图再次从值中找到您的位置。你知道吗</p>
<p>在本例中,您真正想要的是一个“multidict”,一个将键映射到值集合的字典。在本例中,校验和是对名称集合的校验和。然后,任何映射到一个包含多个名称的集合的校验和,都是一个dup,而这个集合正是您要打印的名称列表,所以这就是所需要的。你知道吗</p>
<p>在Python中,multidict通常表示为一个dict,其值是列表或集合。您可以使用元组,正如您所尝试的那样,它将起作用,但从概念上讲,它们通常表示固定长度、异构的值集合,其中值的索引告诉您有关其含义的信息。这里的长度是任意的。值的同质集合,其中索引没有意义,甚至顺序也没有意义。那是一个集合,不是一个元组。(如果顺序不是无意义的,那么它要么是一个列表,要么是一个<code>OrderedSet</code>。)</p>
<p>例如:</p>
<pre><code>>>> pairs = [("sumstring1","abc.txt"), ("sumstring2","def.txt"),
... ("sumstring1","ghi.txt"), ("sumstring2","jkl.txt")]
>>> dups = collections.defaultdict(set)
>>> for checksum, name in pairs:
... dups[checksum].add(name)
>>> dups
defaultdict(<class 'set'>, {'sumstring1': {'ghi.txt', 'abc.txt'}, 'sumstring2': {'def.txt', 'jkl.txt'}})
</code></pre>
<p>要消除任何非重复数据:</p>
<pre><code>>>> dups = {checksum: names for checksum, names in dups.items() if len(names) > 1}
>>> dups
{'sumstring1': {'abc.txt', 'ghi.txt'}, 'sumstring2': {'def.txt', 'jkl.txt'}}
</code></pre>
<p>(当然,在您的示例中我们没有任何非重复,所以这不是很令人兴奋)。你知道吗</p>
<p>如果您不关心校验和,只需要一个集合列表:</p>
<pre><code>>>> dups = list(dups.values())
</code></pre>
<p>如果你真的因为某种原因想要元组而不是集合:</p>
<pre><code>>>> dups = [tuple(names) for names in dups.values()]
>>> dups
[('ghi.txt', 'abc.txt'), ('def.txt', 'jkl.txt')]
</code></pre>