2014-07-08 1 views
0

키를 기반으로 데이터 행을 그룹화하고 해당 그룹의 행 중 하나라도 상태 필드에 "R"이있는 경우 모두 해당 필드가 "R ".그룹 내의 요소 변경

from operator import itemgetter 
from itertools import groupby 

headers = data.pop(0) 
Col = {headers[i].strip().upper():i for i in range(len(headers))} 

data = sorted(data, key=itemgetter(Col["KEY_FIELD"])) 
for key,group in groupby(data, lambda x: x[Col["KEY_FIELD"]]): 
    for item in group: 
    if any([item[Col["STATUS"]]=="R" for item in group]): 
     item[Col["STATUS"]] = "R" 

그러나이 데이터에서 아무것도 변경하지 않는 것 :

는 여기에 내가 해봤 코드입니다. 이 기준에 따라 각 그룹에 대해 원래 데이터 변수를 변경하는 비장의 방법이 있습니까? 아니면 각 그룹을 반복 한 후에 새 목록을 만들고 데이터를 복사해야합니까?

+1

는'=='대입 연산자 – ElmoVanKielmo

+0

감사되지 않습니다 : 당신은 단지 status_r 조건이 충족 된 경우 그렇게해야하는 경우 다시 그룹을 통해 루프에서 약간의 포인트가있다. 수정으로 문제를 해결했습니다. 코드는 여전히 데이터를 변경하지 않습니다. – CCKx

답변

1

group반복자이므로 두 번 반복해서 반복 할 수 없습니다. 당신은 아마 for 루프가 if 테스트를 반전 할

group_key = itemgetter(Col["KEY_FIELD"]) 
data = sorted(data, key=group_key) 

for key, group in groupby(data, group_key): 
    group = list(group) 
    status_r = any(item[Col["STATUS"]] == "R" for item in group) 
    for item in group: 
     if status_r: 
      item[Col["STATUS"]] = "R" 

; 단지 일단 첫 번째 목록에 그룹 및 테스트 변환

for key, group in groupby(data, group_key): 
    group = list(group) 
    if any(item[Col["STATUS"]] == "R" for item in group): 
     for item in group: 
      item[Col["STATUS"]] = "R" 
+0

두 번째 코드 블록은 실제로 내가 원래 가지고 있던 형식이며, 그룹을 목록으로 변환하는 것이 아니라 트릭을 수행 한 것입니다. – CCKx