我需要从用户(由10个整数组成)拆分raw_input,这样我就可以找到最大的奇数。如果字符串中没有赔率,则最终输出应为最大奇数或“无”。这段代码给了我一个TypeError:并不是在字符串格式化错误期间转换的所有参数。我使用的是Python 2.7。
这就是我所拥有的:
def uiLargestOddofTen():
userInput = raw_input("Please enter ten integers:")
oddList = []
x = userInput.split()
n = 10
for element in x:
y = int(element)
while n > 0:
if element % 2 != 0:
oddList.append(y)
n = n - 1
return max(oddList)
感谢您的帮助!!
答案 0 :(得分:3)
列表理解如何:
if len(x) == 10:
oddList = [int(a) for a in x if int(a) % 2]
if oddList:
return max(oddList)
假设x需要长10个值;假设您不需要else语句。
您无需检查int(a) % 2 != 0
,因为如果它为零,则无论如何都会返回false。
答案 1 :(得分:2)
TypeError
来自您使用来自userInput.split()
的字符串,而不是在对它们进行数学运算之前将它们显式转换为整数。请注意,其他答案通过用int()
包围对该列表中元素的引用来强制将数字输入字符串转换为整数来解决此问题。
编辑:这一行:
if element % 2 != 0:
应该成为:
if y % 2 != 0:
然后你的代码会起作用,虽然这里的一些其他答案提供了更简洁的替代方案。
答案 2 :(得分:2)
您可以尝试这样的事情:
def solve(strs):
inp = strs.split()
#convert items to `int` and get a filtered list of just odd numbers
odds = [x for x in (int(item) for item in inp) if x%2]
#if odds is not empty use `max` on it else return None
return max(odds) if odds else None
...
>>> print solve('2 4 6 8 11 9 111')
111
>>> print solve('2 4 6 8')
None
上面代码的 itertools.imap
版本:
from itertools import imap
def solve(strs):
inp = imap(int, strs.split())
odds = [x for x in inp if x%2]
return max(odds) if odds else None
...
>>> print solve('2 4 6 8 11 9 111')
111
>>> print solve('2 4 6 8')
None
在python-3.4中,传递给它的iterable返回时返回的max()
now accepts a default value为空。所以上面的代码可以改为:
def solve(strs):
#except `strs.split()` no other list is required here.
inp = map(int, strs.split())
return max((x for x in inp if x%2), default=None)
答案 3 :(得分:1)
max(filter(lambda x: int(x) & 1, raw_input().split()))
如果没有奇数整数,它会抛出一个异常,所以你可以捕获它然后返回None。
完整代码的示例:
try:
res = max(filter(lambda x: int(x) & 1, raw_input().split()))
except ValueError:
res = None
print res