2014-07-08 74 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" 

然而,這似乎並沒有更改數據什麼。根據這個標準,是否有改變每個組的原始數據變量的pythonic方式,還是需要創建一個新列表並在迭代每個組之後將數據複製到該列表中?

+1

''==不賦值運算符 – ElmoVanKielmo

+0

感謝。修復它與編輯。代碼仍然不會更改數據。 – CCKx

回答

1

group迭代器,你不能循環它兩次那樣。以轉換組到列表第一和測試只是一次

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環和if測試那裏。還有再次在小組循環,如果你只需要這麼做,如果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