2017-05-09 3 views
1

나는 row라는 목록을 가지고 :다음 목록 이해가 파이썬에서 작동하지 않는 이유는 무엇입니까?

나는 몇 가지 숫자는 한 번으로 대체 취득하고 나머지는 문자열 'ABS'로 대체됩니다 있도록 row[1]을 변경하려면
row = ['1234', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]] 

. 이런 식으로 뭔가 :

['1234', ['ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', '09:54:59', '09:55:18', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS', 'ABS']] 

여기 내 코드입니다 :

for obj in row_objs: 
    row[1] = [str(obj.punch.time()) if x==obj.punch.day else 'ABS' for x in row[1]] 

하지만 위의 코드와 함께 'ABS'로 대체 모든 숫자가 계속. 나는이 작업을 수행 할 때

:

for obj in row_objs: 
    row[1] = [str(obj.punch.time()) if x==obj.punch.day else x for x in row[1]] 

시간은 제대로 배치되어 있지만 다른 숫자가 아직.

['1234', [1, 2, 3, 4, 5, 6, 7, '09:54:59', '09:55:18', 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]] 

여기에 무슨 문제가 있습니까?

+2

아직 커피가 충분하지 않을 수도 있지만 문제는 아니며 'for'루프 반복마다 "row [1]"이 덮어 쓰여지므로 OP가 마지막 되풀이? – timgeb

+0

@timgeb 그게 문제인 것처럼 보입니다. 그들은 단지 그들의 질문을 업데이 트했습니다. –

+0

@timgeb : 전에 언급 한'for' 루프는 거기에 없었습니다. 그들은 각각의 for 반복이 다음 반복에 영향을주지 않을 것으로 기대하고 있습니다. –

답변

3

각 반복마다을 목록으로 바꾸십시오. for 루프의 마지막 obj은 정수 중 하나와 일치하지 않으므로 최종 결과'ABS' 문자열로만 목록을 생성 한 것입니다. x을 다시 사용하여 이미 바꾼 값을 사용하기 때문에 두 번째 루프가 작동합니다. 원래 정수 또는 나중에 time() 대체가 될 수 있습니다.

루프를 for 루프로 사용하지 마십시오. str(...time()) 결과에 day 속성을 매핑 사전에 모든 obj.punch 값을 수집, 다음 경기를 찾기 위해 지능형리스트를 사용

days = {obj.punch.day: str(obj.punch.time()) for obj in row_objs} 
row[1] = [days.get(x, 'ABS') for x in row[1]] 

지금 당신이 한 번만 row[1]를 교체합니다.

0
for obj in row_objs: 
    row[1] = [str(obj.punch.time()) if x == obj.punch.day else isinstance(x, int) and 'ABS' or x for x in row[1]] 
+1

이 코드는 질문에 대답 할 수 있지만 이유 및/또는이 코드가 질문에 어떻게 대답하는지에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다. –