更改组内的元素

时间:2014-07-08 14:17:26

标签: python python-2.7 itertools

我根据一个键将数据行分组在一起,如果该组中的任何一行有" 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 个答案:

答案 0 :(得分: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"