<p>列表理解是创建单个列表的一种方法。基本条件表必须采用以下格式:</p>
<pre><code>[ expression for item in iterable if condition ]
</code></pre>
<p>你不能(轻松地)用一种理解更新两个对象。另外,声明logstocrunch_finset和errorlist然后填充它们也没有多大意义。相反,像这样的事情怎么样:</p>
<pre><code>pattern = re.compile(r"\d*F[IR]P", re.IGNORECASE)
logstocrunch_finset = {x for x in logstocrunch_set if pattern.search(x)}
errorlist = [f'{x} is not proper name' for x in logstocrunch_set.difference(logstocrunch_finset)]
</code></pre>
<p><strong>以下更新</strong>-与for循环的性能比较</p>
<p>正如@Barmar所建议的,我对我们的两个解决方案进行了基准测试。里面没什么。这两种理解似乎能更好地处理更大的输入集。更改有效数据与无效数据的比率似乎没有多大区别</p>
<pre class="lang-py prettyprint-override"><code>import re
range_limit = 10
logstocrunch_set = set(
[f'{i}FRP' for i in range(range_limit)] +
[f'longer_{i}frp_lower' for i in range(range_limit)] +
['not valid', 'something else']
)
pattern = re.compile(r"\d*F[IR]P",re.IGNORECASE)
</code></pre>
<pre class="lang-py prettyprint-override"><code>%%timeit -n 100000 -r 20
logstocrunch_finset = set()
errorlist = []
for x in logstocrunch_set:
if pattern.search(x):
logstocrunch_finset.add(x)
else:
errorlist.append(f'{x} is not proper name')
</code></pre>
<ul>
<li>范围限制=每个回路10 | 9.53µs±34.2 ns(20次运行的平均值±标准偏差,每个回路100000次)</li>
<li>范围|限值=50 | 45.5µs±699 ns/回路(20次运行的平均值±标准偏差,每个100000回路)</li>
<li>范围限制=每个回路100 | 89.4µs±1.2µs(10次运行的平均值±标准偏差,每个100000个回路)</li>
</ul>
<pre class="lang-py prettyprint-override"><code>%%timeit -n 100000 -r 20
logstocrunch_finset = {x for x in logstocrunch_set if pattern.search(x)}
errorlist = [f'{x} is not proper name' for x in logstocrunch_set.difference(logstocrunch_finset)]
</code></pre>
<ul>
<li>范围|限值=每个回路10 | 9.58µs±14.1 ns(20次运行的平均值±标准偏差,每个回路100000次)</li>
<li>范围限制=每个回路50 | 42.2µs±24.7 ns(20次运行的平均值±标准偏差,每个回路100000次)</li>
<li>范围限制=每个回路100 | 82.2µs±491 ns(10次运行的平均值±标准偏差,每个回路100000次)</li>
</ul>