我根据一个键将数据行分组在一起,如果该组中的任何一行有" 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方法,或者是否需要创建新列表并在迭代每个组后将数据复制到其中?
答案 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"