<p>在最初的问题中,您可能(我只是瞥了一眼)使用了<code>set</code>的大小写折叠字符串来查看您是否有一个新的或一个重复的字符串,并在继续时构建一个新字符串列表。你知道吗</p>
<p>您可以用<code>Counter</code>而不是<code>set</code>替换它。但是你需要建立一个列表,然后返回并用计数编辑它。你知道吗</p>
<p>因此,将<code>set</code>/<code>Counter</code>和输出列表替换为<code>OrderedDict</code>,该列表存储每个大小写折叠项的项计数对:</p>
<pre><code>d = collections.OrderedDict()
for item in myList:
caseless = item.lower()
try:
d[caseless][1] += 1
except KeyError:
d[caseless] = [item, 1]
</code></pre>
<p>…然后传递该dict以生成输出列表:</p>
<pre><code>myList = []
for item, count in d.values():
if count > 1:
item = '{} ({})'.format(item, count)
myList.append(item)
</code></pre>
<p>您可以使它更简洁(例如,<code>myList = ['{} ({})'.format(item, count) if count > 1 else item for item, count in d.values()</code>),这也将使它通过一个小的常量因子更快一些。你知道吗</p>
<p>你可以用<code>%</code>代替<code>format</code>来缩短几纳秒的时间,用<code>%d</code>代替<code>%s</code>可能会缩短更多的时间(尽管我认为最后一部分在2.7之前都不再适用)。你知道吗</p>
<p>根据您的平台,<code>a[0] += 1</code>可能比<code>a[1] += 1</code>快或慢。所以两种方法都试一下,如果<code>a[0]</code>更快,就用<code>[count, item]</code>对代替<code>[item, count]</code>。如果您有大量的dup,您可能需要考虑一个带有<code>__slots__</code>的类,这个类的更新速度实际上比列表快一些,但创建速度要慢得多。你知道吗</p>
<p>另外,使用<code>in</code>测试,或者将<code>d.__contains__</code>存储为本地测试,可能比<code>try</code>快,也可能慢,这取决于您期望的重复次数,所以请在实际数据而不是玩具数据集上尝试这三种方法。你知道吗</p>