2013-02-01 5 views
3

세 번째 반복이 가능합니까?목록 이해가있는 파이썬 삼원 반복

c = 0 
list1 = [4, 6, 7, 3, 4, 5, 3, 4] 
c += 1 if 4 == i for i in list1 else 0 

더 실제적인 예 :이 특정 예는 더 나은 방법으로 수행 할 수 있지만 무슨 뜻인지의 단순한 버전은

strList = ['Ulis', 'Tolus', 'Utah', 'Ralf', 'Chair'] 
counter = 0 
counter += 1 if True == i.startswith('U') for i in strList else 0 
return counter 

답변

5

귀하의 "실제적인 예"로 기록됩니다

>>> strList = ['Ulis', 'Tolus', 'Utah', 'Ralf', 'Chair'] 
>>> sum(1 for el in strList if el.startswith('U')) 
2 

다른 예제는 (내가 제대로 이해한다면)입니다 :

>>> list1 = [4, 6, 7, 3, 4, 5, 3, 4] 
>>> list1.count(4) 
3 

(또는 단지 strList 예를 적용하지만, 내장 방법을 사용하여 아무 문제)

+1

'sum()'은'bool' 값을 받아 들여서'False'를'0'으로,'True'를'1'로 변환합니다. 따라서,이 코드는 또한 작동합니다 :'sum (strList의 엘을위한 el.startswith ('U'))' – steveha

+1

@steveha가 실제로 작동하지만, 나는 명시 적으로 선호한다. –

+0

@steveha : 파이썬'bool'은 서브 클래스이다. 'int' (역사적 이유로); 단순한 정수 산술로 변환하는 것은'sum'이 아닙니다. '0 + True == 1'. –

0

또한 지능형리스트로 항목을 선택 할 수 있으며, 목록에있는 요소의 수를 가져 가라.

strList = ['Ulis', 'Tolus', 'Utah', 'Ralf', 'Chair'] 
len([k for k in strList if k.startswith('U')]) 
+0

이것에 대한'list'를 만들 필요가 없습니다 ... –

+1

len()을 사용하려면 목록 이해력에 의지해야합니다. 또는 적어도 이것은 이것을하는 방법입니다. – octoback

+0

@antitrust 제 생각에 @Jon은 목록을 작성하고 계산할 필요가 없으므로'sum (generator)'이'len (list)'보다 선호된다고 생각합니다. 그것 –

1

@ 존 클레멘트는 훌륭한 대답을주었습니다. 파이썬 관용구를 사용하여 문제를 해결하는 방법입니다. 다른 Python 프로그래머가 코드를 보면 즉시 이해할 수 있습니다. 파이썬을 사용하여이를 수행하는 것이 올바른 방법입니다.

실제 질문에 대답하려면 : 아니오, 작동하지 않습니다.

expr1 if condition else expr2 

conditionbool로 평가 뭔가해야합니다 : 삼항 연산자는이 양식을 가지고있다. 삼항 식은 expr1expr2 중 하나를 선택합니다.

c += 1 if condition else 0과 같은 표현식을 사용해 보았을 때 나는 놀랐으며이 대답의 첫 번째 버전에 주목했습니다. @TokenMacGuy 정말 무슨 일이 벌어지고 있는지하는 것을 지적 :

c += (1 if condition else 0) 

그래서 만약 당신이 대신 루프의 어떤 종류의 적절한 조건에 넣어 경우에도, 당신이하려고했던 일을 할 수 없습니다. 위의 경우는 작동하지만 다음과 같은 결과는 실패합니다.

c += 1 if condition else x += 2 # syntax error on x += 2 

이것은 파이썬이 할당 문을 표현식으로 간주하지 않기 때문입니다.

는이 일반적인 실수 할 수 없습니다 : 여기

if x = 3: # syntax error! Cannot put assignment statement here 
    print("x: {}".format(x)) 

가능성이 값을 테스트 x == 3를 원하는 프로그래머,하지만 x = 3을 입력했습니다. 파이썬은 할당을 표현식으로 간주하지 않기 때문에이 실수로부터 보호합니다.

실수로 할 수 없으며이를 목적으로도 할 수 없습니다.

+2

'c + = 1'은 표현식이 아니며, 과제입니다. 명령문은'c + = (cond else else false)'로 괄호로 묶일 것입니다. 다른 곳에서는'c + = 1'을 사용할 수 없습니다. 예를 들어 'truth else if c else = 1'은 '(truth else if c else + c) + = 1'으로 괄호로 묶을 수 있습니다. 조건식에 할당하지 마라. – SingleNegationElimination

+0

아, 맞습니다! 나는 그것이 효과적이었던 것에 놀랐다. 그러나 나는 정말로 일어나고 있었던 것에 관해 충분히 생각하지 않았다. 글쎄, 내 대답을 편집 할 시간이야. 나를 고쳐 줘서 고마워. – steveha