2013-10-08 6 views
-1

여기에이 코드에 대해 몇 가지 질문이 있습니다. 내가 뭘 하려는지 2 입력, 옵션 및 옵션을 옵션을 0 또는 1 걸리는 함수를 작성하고 목록에있는 숫자 목록을 반환합니다. 옵션이 0이면 5보다 크거나 -5보다 작은 숫자를 반환합니다. 옵션이 1이면 첫 번째 목록의 모든 홀수 목록을 반환합니다. 이것은 내가 지금 코드가 무엇을 :목록에서 숫자를 반환하려고 시도합니다.

def splitList(myList, option): 
    nList = [] 
    for element in range(0,len(myList)): 
     if option == 0: 
      if myList[element] > 5: 
       nList.append(element) 
    return nList 

을 지금 내가 요소가 5보다 큰 경우의 목록을 반환하는 데있어, 그러나, 목록에없는 실제 값 곳이 반환합니다. 이 [2, 3]

내가 너무 7, 8도의 값을 반환합니다 반환 I 프로그램

splitList([-6,4,7,8,3], 0) 

를 실행 말 -6하지만 난 권리가 없습니다 알고 현재 -6을 리턴하는 코드. 누군가 나를 올바른 방향으로 안내 할 수 있습니까? 또한 for 루프를 사용하고 싶습니다. 또한 나는 옵션이 여기 1.

인 경우 홀수 번호를 반환하는 방법을 단서가 작동하는 내 코드입니다 있습니다

def splitList(myList, option): 
    nList = [] 
    for element in myList: 
     if option == 0: 
      if abs(element) > 5: 
       nList.append(element) 
     elif option == 1: 
      if element % 2: 
       nList.append(element) 
    return nList 
내가 while 루프이를 전환 할 수있을 것 어떻게

? 나는 다음 코드를 시도했지만이 작동하지 않습니다

def splitList2(myList, option): 
    nList = [] 
    element = 0 
    while element < len(myList): 
     if option == 0: 
      if abs(element) > 5: 
       nList.append(element) 
     elif option == 1: 
      if element % 2: 
       nList.append(element) 
     element = element + 1 
    return nList 
+0

'nList.append (myList [element]) '를 원하는 곳에'nList.append (element)'가 있습니다. – tripleee

+0

절대 값을 5보다 크게하려면'abs()'또는'or' 문이 필요합니다 ... – beroe

+0

홀수는 'number % 2'이 0이 아닌 숫자입니다. – tripleee

답변

3

당신의 변수 element 이름을 지정에도 불구하고, 실제로는 인덱스가 아닌 그 인덱스에있는 요소입니다.

이것을 비교하려면 myList[element]을 사용해야하므로 말할 수 있습니다.

그래서, 그것을 해결하기 위해, 다시 같은 일을 :

nList.append(myList[element]) 

그러나,이 작업을 수행하는 매우 간단한 방법이있다 : 직접 요소를 그냥 루프를.

nList = [] 
for element in nList: 
    if option == 0: 
     if element > 5: 
      nList.append(element) 
return nList 

당신은 거의 결코range(len(spam))을 통해 루프합니다. 대개 요소 만 필요하므로 spam 자체를 반복하면됩니다. 경우에 따라 색인이 필요하므로 enumerate(spam)을 반복하십시오. 색인을 필요로하는 경우 ... 뒤로 물러나 실제로해야하는지 확인하십시오 (사람들은 종종 zip에 대해 알지 못하기 때문에이 정보를 원한다고 생각하거나 복사하는 대신 내부에서 변경하려고하기 때문에 작동하지 않는 방식으로 작업). 더 간단하게

또는 : 한편

if option != 0: 
    return [] 
return [element for element in nList if element > 5] 

:

내가 너무 7, 8도의 값을 반환합니다 -6하지만 난 그렇게하지 알고 지금 -6을 반환하는 올바른 코드를 가져야합니다.

당신은 파이썬에 직접 영어로 번역 할 수 있습니다 :

그것보다 -5

5보다 크거나 작은 숫자입니다 ...를 반환합니다

… element > 5 or element < -5 … 

그러나 이것을 이해하는 방법으로 간단하게 작성할 수 있습니다.

… abs(element) > 5 … 

그래서,이 작업에 대한 옵션 0을 가져옵니다. 옵션 1은 어떨까요?

숫자가 이상한 지 알 수있는 간단한 방법은 number % 2이 0이 아닌 경우입니다.

자, 모두 함께 넣어 보자

if option == 0: 
    return [element for element in nList if abs(element) > 5] 
elif option == 1: 
    return [element for element in nList if element % 2] 
else: 
    raise ValueError("I don't know option {}".format(option)) 

을 코멘트에서 :

이 가

가 어떻게 while 루프로 변경할 것

? while 테스트를 작성, 루프 변수를 초기화하고, 신체 내부의 루프 변수를 업데이트

당신은 세 부분으로 그것을 깰해야하는 while 루프에 for 루프를 변경합니다. 일반적인 번역은 다음과 같습니다.

for element in iterable: 
    spam(element) 

it = iterator(iterable) 
while True: 
    try: 
     element = next(it) 
    except StopIteration: 
     break 
    else: 
     spam(element) 

추악한가요? 그러나 대개의 경우, 귀하는 귀하의 사건과 관련된보다 간단한 것을 제안 할 수 있습니다. 반복 가능한이 시퀀스 인 경우 예를 들어, list을 나열이를 수행 할 수 있습니다 for 루프만큼 좋은 아니지만, 일반 while만큼 추악한하지 여전히

index, size = 0, len(sequence) 
while index < size: 
    spam(sequence[index]) 
    index += 1 

합니다.


마지막으로 재미 만 있습니다. 함수 매핑이 elif 체인보다 Python적임을 모두 알고 있습니다. 맞습니까? 그런 독단적으로 다음과 같은 규칙의 가치를 증명하기 위해, 여기를하자 : 당신은 단지 두 개의 별도의 함수를 작성해야처럼

preds = {0: lambda x: abs(x) > 5, 
     1: lambda x: x % 2} 
def splitList(myList, option): 
    return filter(preds[option], myList) 
+1

홀수 필터를 'option == 1'에 추가 할 수도 있습니다. –

+0

@IskarJarak : 물론 그렇습니다. – abarnert

+0

@IskarJarak : 옵션 0과 1이 섞여 계속 나타납니다. (이것이 우리가 열거 형을 사용하는 이유입니다 ...) 그것을 점검하고 지금 당장 확인할 수 있습니까? – abarnert

1

함수 한 이후에하지 않고 여러 가지 옵션을 추가하기 위해 노력하고, 보인다.

for element in myList: 
    if option == 0: 
     if element > 5: 
      nList.append(element) 
    .... 
+0

어떻게 이것을 while 루프로 전환 할 수 있습니까? @decency –

+0

@RyanErickson 그렇지 않겠지 만 루프마다 반복되는 동안 반복 할 때 늘릴 변수를 만들 수 있습니다. –

0

때문에 한 라이너가 재미 :이 숙제 인 경우

def splitlist(li, flag): 
    return [x for x in li if x%2==1] if flag else [x for x in li if abs(x)>5] 

, 당신은 아마 싶지 않아

파이썬은 쉽게 목록 및 다른 데이터 구조를 반복 할 수 있습니다 이것을 위해 대답을 넣었지만 몇 가지 아이디어가 있어야합니다.

0

기타 질문에 대한 대답은 분명히 들어 있지만 논쟁의 여지가별로 없습니다. 더 나은 것 네 가지 중요한 점은 여기에 입증 있습니다

def extract_elements(my_list, odd_only): 
    """Return select elements from my_list. 

    If odd_only is True return the odd elements. 
    If odd_only is False return elements between -5 and 5 inclusive. 
    """ 
    … 

:

  1. 이름이 매우 중요하다, odd_only 훨씬 더 설명 option보다, 그것은 아무것도 분할하지 않을 때 방법 splitList를 호출 읽을 때 혼란 스럽다.
  2. 언어에 내장 부울 값이있는 경우 부울 옵션을 나타내는 데 임의의 정수를 사용하지 마십시오.
  3. 독자가 매우 특이한 기능을 이해하도록 허용 할 수있는 방법의 이름이 없습니다 (extract_odd_or_magnitude_of_five은 입력하기가 어렵고 은 여전히 ​​은 설명이 아닙니다). 따라서 docstrings이있는 이유는 메서드 설명을 메서드 정의에 매우 밀접하게 연결하기 때문입니다.
  4. 대회 문제. Style Guide for Python은 다른 사람들이 귀하의 코드를 읽는 것을 돕습니다.
관련 문제