Вся структура, которую вы используете для хранения данных, вероятно, неверна, но, поскольку я не знаю, как вы ее используете, я не могу вам с этим помочь.
Вы можете получитьизбавиться от всех этих has_key()
вызовов с помощью collections.defaultdict
.Примечание. thedict.has_key(key)
в любом случае устарела, вместо этого следует использовать key in thedict
.
Посмотрите, как я тоже изменяю цикл for
- вы можете назначать имена прямо в операторе for
, нетнужно сделать это отдельно.
from collections import defaultdict
def processClickOutData(cls, raw_data):
absolute_total = 0
absolute_total_true = 0
list_channels = set()
list_tids = set()
total = defaultdict(int)
total_true = defaultdict(int)
total_position = defaultdict(int)
total_position_true = defaultdict(int)
def defaultdict_int():
return defaultdict(int)
singles = defaultdict(defaultdict_int)
singles_true = defaultdict(defaultdict_int)
channels = defaultdict(defaultdict_int)
channels_true = defaultdict(defaultdict_int)
tid_position = defaultdict(defaultdict_int)
tid_position_true = defaultdict(defaultdict_int)
channel_position = defaultdict(defaultdict_int)
channel_position_true = defaultdict(defaultdict_int)
for gap, count, prefered, channel, position in raw_data:
list_channels.add(channel)
list_tids.add(tid)
absolute_total += count
total[gap] += count
singles[gap][tid] += count
channels[gap][channel] += count
total_position[position] += count
tid_position[position][tid] += count
channel_position[position][channel] += count
if prefered == 0:
absolute_total_true += count
total_true[gap] += count
singles_true[gap][tid] += count
channels_true[gap][channel] += count
total_position_true[position] += count
tid_position_true[position][tid] += count
channel_position_true[position][channel] += count
final_values = {"singles" : singles, "singles_true" : singles_true, "total" : total, "total_true": total_true, "absolute_total": absolute_total, "absolute_total_true": absolute_total_true, "channel_totals" : channels, "list_channels" : list_channels, "list_tids" : list_tids, "channel_totals_true" : channels_true,
"total_position" : total_position, "total_position_true" : total_position_true, "tid_position" : tid_position, "channel_position" : channel_position, "tid_position_true" : tid_position_true, "channel_position_true" : channel_position_true }
return final_values
Для этого автоматически заполняются правильные значения по умолчанию, если ключи не существуют.У вас есть два вида здесь.Когда вы добавляете int
s, вы хотите начать с 0
, если он не существует - вот что возвращает int
, следовательно, defaultdict(int)
.Когда вы добавляете словарь, который добавляет int
s, вам нужно использовать функцию, которая возвращает defaultdict(int)
, что делает defaultdict_int
.
Редактировать: Предлагаемый альтернативный вариантсловарная структура:
position = defaultdict(lambda: defaultdict(defaultdict_int))
gap = defaultdict(lambda: defaultdict(defaultdict_int))
absolute_total = 0
for gap, count, prefered, channel, position in raw_data:
absolute_total += count
posd = position[position]
posd.setdefault('total', 0)
posd['total'] += count
posd['tid'][tid] += count
posd['channel'][channel] += count
gapd = gap[gap]
gapd.setdefault('total', 0)
gapd['total'] += count
gapd['tid'][tid] += count
gapd['channel'][channel] += count
Сделайте то же самое с версиями _true
, и вы перешли с 12 dict
с на 4.