2014-07-08 48 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