Изменение элементов в группе

Я группирую строки данных вместе на основе ключа, и если какая-либо из строк в этой группе имеет «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"

Однако это, похоже, ничего не меняет в данных. Есть ли питонический способ изменить исходную переменную данных для каждой группы на основе этого критерия, или мне нужно создать новый список и скопировать в него данные после итерации по каждой группе?


person CCKx    schedule 08.07.2014    source источник
comment
== не является оператором присваивания   -  person ElmoVanKielmo    schedule 08.07.2014
comment
Спасибо. Исправлено редактированием. Код по-прежнему не меняет данные.   -  person CCKx    schedule 08.07.2014


Ответы (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"
person Martijn Pieters    schedule 08.07.2014
comment
Этот второй блок кода на самом деле является форматом, который у меня был изначально, без преобразования группы в список, что и помогло. - person CCKx; 08.07.2014