2017-01-31 2 views
0

У меня есть словарь в Python, которые выглядят любят это:скоринг мотивов в питона словаре

raw = {'id1': ['KKKK', 'MMMMMMMMMMMMMMM'], 'id2': ['KKKKM', 'KKKKKK']} 

, как вы видите значение список. Я хотел бы заменить список номером, который является счетом. Я забиваю каждый символ в списке, исходя из их длины. если длина будет от 4 до 9, они получат 1, от 10 до 15 будет 2 и 16, а дольше будет 3. Затем я суммирую все баллы за идентификатор и получаю один балл за идентификатор. вот небольшой пример:

score = {'id1': 3, 'id2': 2} 

Я попробовал этот код:

score = {} 
for val in raw.values(): 
    for i in val: 
     if len(i) >=4 and len(i) <9: 
      sc = 1 
     elif len(i) >=10 and len(i) <15: 
      sc = 2 
     else: 
      sc = 3 
     score[raw.keys()] = sc 

он не давал, что я хочу.

ответ

0

Я вижу две проблемы в вашем примере.

Во-первых, нет никаких дополнительных приращений. Вы должны инициализировать счетчик во внешнем цикле и увеличивать его при повторении элементов в ключе.

for val in raw.values(): 
    score = 0 
    for i in val: 
     ... 
     score += 1 # or 2 or 4 

Вторая проблема заключается в том, что вы должны получить доступ к определенной клавиши вы забивая при хранении очков. Поскольку «raw.keys()» возвращает список всех ключей, использовать его при хранении не имеет смысла. Вместо этого ваш внешний цикл должен перебирать как ключ, так и значение, что позволяет вам узнать, какой ключ вы используете.

for key, val in raw.items(): 
    .... 

Итак, вот рабочий пример:

score = {} 
for key, val in raw.items(): # iterating over both key and value (.items instead of .values) 
    cur_score = 0 # initializing the current score counter 
    for item in val: # use readable names! 
     item_len = len(item) # calculated once for efficiency 
     if 4 <= item_len < 9: # the python way to check value in range 
      cur_score += 1 
     elif 10 <= item_len < 15: 
      cur_score += 2 
     else: 
      cur_score += 3 
     score[key] = cur_score 

Удачи!

0

Вы пытались использовать весь список ключей в качестве индекса в словаре. Кроме того, вы помещаете это назначение в обе петли. Что вы делали , что делать на каждой итерации?

Во-первых, ваш внешний цикл должен перебирать список элементов словаря, а не только значения. Вам понадобится что-то вроде:

for key, val in raw.iteritems(): 

Далее вам нужно поддерживать общее количество баллов для отдельных строк. Вы должны смотреть это вверх ... но основная идея

total = 0 
    for item in my_list: # you have to determine what my_list should be 
     sc = # score for that item 
     total += sc 

... и, наконец, после этого цикла ...

score[key] = total 

Это должно помочь вам двигаться вперед.

0

Вам необходимо выполнить итерацию по всем парам ключей, значений словаря и поддерживать общее количество баллов для каждого элемента значений словаря (что является списком в вашем случае).

Вы можете изменить свой код следующим образом, чтобы получить желаемый результат.

raw = {'id1': ['KKKK', 'MMMMMMMMMMMMMMM'], 'id2': ['KKKKM', 'KKKKKK']} 

score = {} 
# iterating through all the key, value pairs of the dictionary 
for key, value in raw.items(): 
    sc = 0 
    # iterating through all the elements of the current value 
    for item in value: 
     if len(item) >=4 and len(item) <=9: 
      sc += 1 
     elif len(item) >=10 and len(item) <=15: 
      sc += 2 
     else: 
      sc += 3 
    score[key] = sc 

print(score) 

Он выводит:

{'id1': 3, 'id2': 2} 

Таким образом, цикл, for key, value in raw.items(): работает для каждого ключа, значение пары словаря, которые являются 'id1': ['KKKK', 'MMMMMMMMMMMMMMM'] и 'id2': ['KKKKM', 'KKKKKK'].

Затем вложенный цикл, for item in value: выполняется дважды для двух значений словарного слова, которые являются ['KKKK', 'MMMMMMMMMMMMMMM'] и ['KKKKM', 'KKKKKK'].

Смежные вопросы