2013-09-05 3 views
2

가장 큰 홀수를 찾을 수 있도록 raw_input을 사용자 (10 개의 정수로 구성)에서 분할해야합니다. 문자열에 확률이 없으면 최종 출력은 가장 큰 홀수 또는 "none"이어야합니다. 이 코드는 나에게 TypeError를 제공합니다. 문자열 서식 지정 오류 중에 변환 된 모든 인수가 아닙니다. 파이썬 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) 

감사합니다!

+1

'n'의 목적은 무엇입니까? for 루프 앞에서'len (x) = 10'을 검사하지 않으시겠습니까? – bozdoz

+0

코드에서 작동하지 않는 것은 무엇입니까? –

+0

여기에서 질문하지 않았습니다. – arshajii

답변

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을 확인하지 않아도됩니다. 0 인 경우 false를 반환하기 때문에 int(a) % 2 != 0을 확인할 필요가 없습니다.

+1

홀수 번호가없는 목록은 어떻습니까? 그러면'max()'가 불평 할 것이다. – Birei

+0

잘 잡습니다. 감사! @Birei – bozdoz

+0

'if len (x) == 10' – arshajii

2

TypeErroruserInput.split()에서 오는 문자열을 수학적으로 계산하기 전에 명시 적으로 int로 변환하지 않고 사용합니다. 다른 답은 숫자의 입력 문자열을 강제로 정수로 변환하는 int()과 함께 해당 목록의 요소에 대한 참조를 둘러 옴으로써이 문제를 해결합니다.

편집 :이 줄 :

if element % 2 != 0: 

이 될해야 : 여기에 다른 답변 중 일부는 훨씬 더 간결 대안을 제공하지만

if y % 2 != 0: 

그런 다음 코드가 작동합니다.

+1

이것은 답변이 아니라 주석이어야합니다. – enginefree

+1

묵시적 질문에 대한 답변입니다. "왜 내가 TypeError를 얻고 있습니까?" –

+1

그는 이미 int로 변환했기 때문에 아마'if y % 2! = 0' 라인을 가질 예정이었습니다. – bozdoz

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 

, 비어에 반복 가능한 통과 할 때 반환되는 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) 
+0

@ user2751871 제 코드가 이미 그렇게합니다. –

+0

감사합니다. 이것은 완벽하게 이해할 수 있습니다. 모든 입력이 짝수 일 경우 "none"을 반환 할 여지가 있습니까? (파이썬 2.7에서) –

+0

@ user2751871 첫 번째 솔루션은 python2.7 전용이며 문자열에 짝수 항목 만 들어 있으면 아무 것도 반환하지 않습니다. (예제도 추가했습니다) –

1
max(filter(lambda x: int(x) & 1, raw_input().split())) 

에는 홀수의 정수가없는 경우 당신이 그것을 잡을 후 None을 반환 할 수 있도록이 예외를 throw : 그래서 위의 코드로 변경 될 수있다.

전체 코드의 예 :

try: 
    res = max(filter(lambda x: int(x) & 1, raw_input().split())) 
except ValueError: 
    res = None 

print res 
+0

정말 멋지다는 괴짜입니다. +1 – dawg

관련 문제