<p>我有很多理解力</p>
<pre><code>l = df.values.tolist()
['|'.join(n)
for n in [[' '.join(z)
for z in zip(*[s.split('|')
for s in r]) if z[1] != 'Smith']
for r in l]]
['James Jacobs|Tim Turner',
'Mickey Mouse|Mini Mouse',
'Mike Mills|Billy McGill|Natasha Tsaka']
</code></pre>
<hr/>
<pre><code>l = df.values.tolist()
df['Full Names'] = [
'|'.join(n)
for n in [[' '.join(z)
for z in zip(*[s.split('|')
for s in r]) if z[1] != 'Smith']
for r in l]]
df
</code></pre>
<p><a href="https://i.stack.imgur.com/QB2nN.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/QB2nN.png" alt="enter image description here"/></a></p>
<hr/>
<p>撇开文字播放不谈,这对示例数据来说相当快</p>
<p><a href="https://i.stack.imgur.com/fADbx.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/fADbx.png" alt="enter image description here"/></a></p>
<hr/>
<p><strong><em>详细解释</em></strong></p>
<pre><code>l
[['Jim|James|Tim', 'Simth|Jacobs|Turner'],
['Mickey|Mini', 'Mouse|Mouse'],
['Mike|Billy|Natasha', 'Mills|McGill|Tsaka']]
</code></pre>
<ul>
<li><code>l</code>是一个列表列表。我将广泛使用列表理解和iterables。你知道吗</li>
<li>每个子列表由2个字符串组成,我将把它们拆分并压缩在一起。你知道吗</li>
<li>拆分的结果将是一个由<code>(first, last)</code>名称组成的元组“列表”。我将使用<code>if z[1] != 'Smith'</code>过滤掉史密斯夫妇。
<ul>
<li>顺便说一句,在这行你可以用<code>z[1] not in list_of_names</code></li>
</ul></li>
<li>然后我将使用<code>' '.join</code>(这实际上是一个函数)将每个元组组合成<code>first last</code></li>
<li>然后我将使用另一个<code>'|'.join</code>来组合<code>first last</code>到<code>first1 last1|first2 last2</code>的子列表。。。以此类推</li>
</ul>
<p>这之所以更快,是因为理解在很大程度上得到了优化。其他的解决方案是使用<code>apply</code>,这是一种通用的循环结构,只能在特殊情况下利用快速循环(如果有人知道更多,请纠正我的错误)。使用<code>lambda</code>绝对不是那种情况。你知道吗</p>