<p>与其使用<code>st in word</code>,不如使用<code>word.find( st )</code>,它将返回匹配的索引,或者<code>-1</code>。然后只需存储找到的索引</p>
<pre><code>def puzzleH( word ):
states = ['al', 'ak', 'az', 'ar', 'ca', 'co', 'ct', 'dc', 'de', 'fl', 'ga',
'hi', 'id', 'il', 'in', 'ia', 'ks', 'ky', 'la', 'me', 'md',
'ma', 'mi', 'mn', 'ms', 'mo', 'mt', 'ne', 'nv', 'nh', 'nj',
'nm', 'ny', 'nc', 'nd', 'oh', 'ok', 'or', 'pa', 'ri', 'sc',
'sd', 'tn', 'tx', 'ut', 'vt', 'va', 'wa', 'wv', 'wi', 'wy']
found_list = []
for st in states:
position = word.find( st )
if ( position != -1 ):
found_list.append( ( st, position ) ) # < Keep the word + position
if ( len( found_list ) >= 5 ):
print("[%s]: " % ( word ) )
for state, position in found_list:
print( " \"%s\" at %d" % ( state, position ) )
for word in [ 'marine', 'desert', 'dessert', 'icecream', 'chocolate', 'ohmmeter', 'comically' ]:
puzzleH( word )
</code></pre>
<p>其中:</p>
<pre><code>$ python3 ./state_find.py
[marine]:
"ar" at 1
"in" at 3
"ma" at 0
"ne" at 4
"ri" at 2
</code></pre>
<p>编辑:针对Linux字典文件进行测试:</p>
<pre><code>words = open( '/usr/share/dict/words.pre-dictionaries-common', 'rt' ).read().split('\n')
for word in words:
if ( word.find( "'" ) == -1 ):
puzzleH( word )
</code></pre>
<p>给出了很多结果:</p>
<pre><code># (just the tail ...)
[windowpane]:
"in" at 1
"ne" at 8
"nd" at 2
"pa" at 6
"wi" at 0
[windowpanes]:
"in" at 1
"ne" at 8
"nd" at 2
"pa" at 6
"wi" at 0
[windstorms]:
"in" at 1
"ms" at 8
"nd" at 2
"or" at 6
"wi" at 0
[windward]:
"ar" at 5
"in" at 1
"nd" at 2
"wa" at 4
"wi" at 0
</code></pre>
<p>哦,“调情”是个好词:</p>
<pre><code>[philandering]:
"de" at 6
"hi" at 1
"il" at 2
"in" at 9
"la" at 3
"nd" at 5
"ri" at 8
</code></pre>
<p><strong>编辑</strong>:它似乎没有像我应该读的那样完全阅读规范。单词需要<em>完全</em>由<em>重叠的</em>状态代码组成</p>
<p>这里有一个版本可以解决这个问题。它从输入字中创建成对的字母,查找要匹配的状态代码,如果找到,则记录位置和状态代码(与以前相同)</p>
<pre><code>def puzzleH( word ):
states = ['al', 'ak', 'az', 'ar', 'ca', 'co', 'ct', 'dc', 'de', 'fl', 'ga',
'hi', 'id', 'il', 'in', 'ia', 'ks', 'ky', 'la', 'me', 'md',
'ma', 'mi', 'mn', 'ms', 'mo', 'mt', 'ne', 'nv', 'nh', 'nj',
'nm', 'ny', 'nc', 'nd', 'oh', 'ok', 'or', 'pa', 'ri', 'sc',
'sd', 'tn', 'tx', 'ut', 'vt', 'va', 'wa', 'wv', 'wi', 'wy']
found_list = []
word_position = 0
for i in range( len( word ) - 1 ):
two_letters = word[i] + word[i+1]
if ( two_letters in states ):
found_list.append( ( two_letters, i ) )
else:
found_list = []
break # word needs to be made of all state-codes
if ( len( found_list ) >= 5 ):
print("[%s]: " % ( word ) )
for state, position in found_list:
print( " \"%s\" at %d" % ( state, position ) )
words = open( '/usr/share/dict/words.pre-dictionaries-common', 'rt' ).read().split('\n')
for word in words:
if ( word.find( "'" ) == -1 ):
puzzleH( word )
</code></pre>
<p>它发现的最长的是:</p>
<pre><code>[malarial]:
"ma" at 0
"al" at 1
"la" at 2
"ar" at 3
"ri" at 4
"ia" at 5
"al" at 6
</code></pre>
<p>有趣的是,在整个73000个单词的字典中只有4个单词(>;=5个代码)</p>