<p>不知何故,你的功能结果应该是什么还不清楚。我猜您希望遍历<code>in1</code>中的所有字符,并将字典中的值作为总数相加。您可能希望在将来为变量使用更有意义的名称,以便您和其他读者能够了解它们应该包含哪些内容</p>
<p>不需要写下映射字典的每个值。写一本字典,让Python帮你完成。字母<code>'U'</code>、<code>'L'</code>和<code>'I'</code>的大小写可以添加到字典中,因此您不必在代码后面处理它们</p>
<p>然后在字符串上循环,从字典中找到条目(默认值为<code>0</code>),并添加这些值以获得总数</p>
<pre><code>import string
def ULIfrom(data):
mapping = {char: ord(char) - ord('a') + 1 for char in string.ascii_lowercase}
mapping['U'] = 10
mapping['L'] = 5
mapping['I'] = 1
total = 0
for character in data:
total += mapping.get(character, 0)
return total
print(ULIfrom(input("enter your encoded phrase:")))
</code></pre>
<p>如果替换,则可以进一步缩短此代码</p>
<pre><code> total = 0
for character in data:
total += mapping.get(character, 0)
return total
</code></pre>
<p>与</p>
<pre><code> return sum(mapping.get(character, 0) for character in data)
</code></pre>
<hr/>
<p>澄清问题后,我将代码调整为:</p>
<pre><code>def get_text_from_ULI(uli):
MAP_CODE = {'U': 10, 'L': 5, 'I': 1}
MAP_NUMBER_TO_CHAR = {ord(char) - ord('a') + 1: char for char in string.ascii_lowercase}
text = ''
words = uli.split('/')
for word in words:
codes = word.split('.')
for code in codes:
number = sum(MAP_CODE.get(c, 0) for c in code)
character = MAP_NUMBER_TO_CHAR.get(number, '')
text += character
text += ' '
return text
print(get_text_from_ULI('LIII.L.UII.UII.UL./.UUIII.UL.ULIII.IIII.'))
</code></pre>
<p>结果是<code>hello word</code></p>
<hr/>
<p>现在来看看真正邪恶的东西。我假设输入是有效的,这样代码就短了一点。这是一条单行线:</p>
<pre><code>def get_text_from_ULI(uli):
return ' '.join(''.join({ord(char)-ord('a')+1:char for char in string.ascii_lowercase}[sum({'U':10,'L':5,'I':1}[c]for c in code)]for code in word.split('.') if code)for word in uli.split('/'))
</code></pre>
<p>孩子们,不要在家里这样做</强></p>