<p>我想不出比使用<code>for</code>循环更好的方法:</p>
<pre class="lang-py prettyprint-override"><code>pattern = "{1} {2}, {0} {1} {2}"
prepositions = ['van', 'von', 'de', 'di']
# (optional) 'lower' so that we don't have to consider cases like 'vAn'
name = "Vincent van Gogh".lower()
index = -1 # by default, we believe that we did not find anything
for preposition in prepositions:
# 'find' is the same as 'index', but returns -1 if the substring is not found
index = name.find(preposition)
if index != -1:
break # found an entry
if index == -1:
print("Not found")
else:
print("The index is", index,
"and the preposition is", preposition)
print(pattern.format(*name.split()))
</code></pre>
<p>产出:</p>
<pre><code>The index is 8 and the preposition is van
van gogh, vincent van gogh
</code></pre>
<p>如果要遍历名称列表,可以执行以下操作:</p>
<pre class="lang-py prettyprint-override"><code>pattern = ...
prepositions = ...
names = ...
for name in names:
name = name.lower()
... # the rest is the same
</code></pre>
<hr/>
<p>第二类介词(<code>"Jr.", "Sr."</code>)的新版本:</p>
<pre class="lang-py prettyprint-override"><code>def check_prepositions(name, prepositions):
index = -1
for preposition in prepositions:
index = name.find(preposition)
if index != -1:
break # found an entry
return index, preposition
patterns = [
"{1} {2}, {0} {1} {2}",
"{1}, {0} {1} {2}"
]
all_prepositions = [
['van', 'von', 'de', 'di'],
["Jr.", "Sr."]
]
names = ["Vincent van Gogh", "Robert Downey Jr.", "Steve"]
for name in names:
for pattern, prepositions in zip(patterns, all_prepositions):
index, preposition = check_prepositions(name, prepositions)
if index != -1:
print("The index is", index,
"and the preposition is", preposition)
print(pattern.format(*name.split()))
break
if index == -1:
print("Not found, name:", name)
</code></pre>
<p>产出:</p>
<pre class="lang-py prettyprint-override"><code>The index is 8 and the preposition is van
van Gogh, Vincent van Gogh
The index is 14 and the preposition is Jr.
Downey, Robert Downey Jr.
Not found, name: Steve
</code></pre>