给定一个字符串,用字母表中的位置替换每个字母。如果文本中的任何内容都不是字母,请忽略它并且不要将其退回。 a为1,b为2,等等。例如:
alphabet_position("The sunset sets at twelve o' clock.")
应该返回"20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11"
(作为字符串。)
cc = "The sunset sets at twelve o' clock."
for i in cc:
if ord(i) >= 97 and ord(i) <= 122:
s = ord(i)-96,
print ''.join(map(str, s)),
elif ord(i)>=65 and ord(i) <= 90:
ss = ord(i)-64,
print ''.join(map(str, ss)),
输出:20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11
在函数内部使用时引发的错误:
def alphabet_position(text):
for i in text:
if ord(i) >= 97 and ord(i) <= 122:
s= ord(i)-96
return ''.join(map(str, s)),
elif ord(i) >= 65 and ord(i) <= 90:
ss= ord(i)-64
return ''.join(map(str, ss)),
是
Traceback (most recent call last):
File "/Users/greatergood/Desktop/acsii2.py", line 10, in <module>
print alphabet_position("The sunset sets at twelve o' clock.")
File "/Users/greatergood/Desktop/acsii2.py", line 8, in alphabet_position
return ''.join(map(str, ss)),
TypeError: argument 2 to map() must support iteration
答案 0 :(得分:1)
map(function, iterable, ...)
将函数应用于iterable的每个项目并返回结果列表。如果传递了其他可迭代参数,则函数必须采用那么多参数,并且并行地应用于所有迭代的项。如果一个iterable比另一个短,则假定使用None项扩展。如果function为None,则假定为identity函数;如果有多个参数,map()返回一个由包含所有迭代中相应项的元组组成的列表(一种转置操作)。可迭代参数可以是序列或任何可迭代对象;结果始终是一个列表。 https://docs.python.org/2/library/functions.html#map
您的论据s
和ss
为integers
,因此不是iterable
这是你想要达到的目标吗?
def alphabet_position(text):
list_of_alphabet = []
for i in text:
if ord(i) >= 97 and ord(i) <= 122:
s = ord(i) - 96
list_of_alphabet.append(s)
elif ord(i) >= 65 and ord(i) <= 90:
ss = ord(i) - 64
list_of_alphabet.append(ss)
return list_of_alphabet
list_of_alphabet = alphabet_position("The sunset sets at twelve o' clock.")
print list_of_alphabet
答案 1 :(得分:1)
您的非功能变体是偶然的。
您在作业结束时放了一个逗号
s = ord(i)-96,
和ss = ord(i)-64,
这使得s
和ss
成为一个元组
因此map
意外地工作。
在您的功能版本中,您省略了悬空逗号,
因此map
停止工作。
比较这些:
s = ord('t') - 96,
print type(s)
与
s = ord('t') - 96
print type(s)
请注意,您的代码还有其他一些问题。
答案 2 :(得分:0)
正如mkiever所说,您的第一个版本似乎有效,因为您将s
和ss
转换为元组。尽管我们经常用括号编写元组,但它们实际上是通过使用逗号创建的。只有在没有它们的情况下代码不明确时才需要括号。
目前尚不清楚你为什么要做map(str, s)
。 map
用于将函数应用于可迭代的每个项目,而不是单个项目。要将s
这样的单个整数转换为字符串,您只需执行str(s)
。
您可以通过将字母转换为相同的大小写来简化测试,而不是分别处理大写和小写。
def letter_ord(c):
return str(ord(c.upper()) - 64) if c.isalpha() else ''
cc = "The sunset sets at twelve o' clock."
a = [letter_ord(c) for c in cc]
print(' '.join([u for u in a if u]))
<强>输出强>
20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11
或者作为一个单行:
cc = "The sunset sets at twelve o' clock."
print(' '.join(filter(None, map(lambda c: str(ord(c.upper()) - 64) if c.isalpha() else '', cc))))