Как назначить определенные оценки из списка значениям в нескольких списках и получить сумму для каждого значения в Python? - PullRequest
0 голосов
/ 03 октября 2018

Не могли бы вы объяснить, как назначить определенные оценки из списка значениям в нескольких списках и получить общую оценку для каждого значения?

score = [1,2,3,4,5] назначить оценку на основе позиции в списке

l_1 = [a,b,c,d,e] назначить a = 1, b = 2, c = 3, d = 4, e = 5

l_2 = [c,a,d,e,b] назначить c = 1, a = 2, d = 3, e =4, b = 5

Я пытаюсь получить результат как {'e':9, 'b': 7, 'd':7, 'c': 4, 'a': 3}

Спасибо!

Ответы [ 6 ]

0 голосов
/ 03 октября 2018

Вы можете zip оба списки с score как один список l3, тогда вы можете использовать словарное понимание с filter для построенияваш диктитон .key является индексом 1 вновь сформированных кортежей в l3, а значение является суммой всех индексов 0 в l3 после создания подсписка, который фильтруется только на соответствиеindex 0 s

score = [1,2,3,4,5] 

l_1 = ['a', 'b', 'c', 'd', 'e'] 
l_2 = ['c', 'a', 'd', 'e', 'b'] 
l3 = [*zip(score, l_1), *zip(score,l_2)]

d = {i[1]: sum([j[0] for j in list(filter(lambda x: x[1] ==i[1], l3))]) for i in l3}
{'a': 3, 'b': 7, 'c': 4, 'd': 7, 'e': 9}

Расширенное объяснение:

d = {}
for i in l3:
    f = list(filter(lambda x: x[1] == i[1], l3))
    vals = []
    for j in f:
        vals.append(j[0])
    total_vals = sum(vals)
    d[i[1]] = total_vals
0 голосов
/ 03 октября 2018

Простейшим способом, вероятно, является использование Counter из стандартной библиотеки Python .

from collections import Counter

tally = Counter()
scores = [1, 2, 3, 4, 5]


def add_scores(letters):
    for letter, score in zip(letters, scores):
        tally[letter] += score


L1 = ['a', 'b', 'c', 'd', 'e']
add_scores(L1)
L2 = ['c', 'a', 'd', 'e', 'b']
add_scores(L2)

print(tally)
>>> python tally.py
Counter({'e': 9, 'b': 7, 'd': 7, 'c': 4, 'a': 3})

zip используется для объединения букв и оценок, forцикл для их перебора и Counter для сбора результатов.Counter на самом деле словарь, поэтому вы можете написать что-то вроде

tally['a']

, чтобы получить оценку для буквы a или

for letter, score in tally.items():
    print('Letter %s scored %s' % (letter, score))

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

Наконец, маленькие буквы и буквы O могут быть проблематичными в качестве имен переменных, потому что их трудно отличить от единиц и нулей.Руководство по стилю Python (часто называемое PEP8) рекомендует избегать их .

0 голосов
/ 03 октября 2018

Вместо того, чтобы хранить свои списки в отдельных переменных, вы должны поместить их в список списков, чтобы вы могли выполнять итерацию по нему и вычислять суммы баллов в соответствии с индексами каждого ключа в подсписках:

score = [1, 2, 3, 4, 5]
lists = [
    ['a','b','c','d','e'],
    ['c','a','d','e','b']
]
d = {}
for l in lists:
    for i, k in enumerate(l):
        d[k] = d.get(k, 0) + score[i]

d станет:

{'a': 3, 'b': 7, 'c': 4, 'd': 7, 'e': 9}
0 голосов
/ 03 октября 2018
from collections import defaultdict

score = [1,2,3,4,5] # note: 0 no need to use this list if there is no scenario like [5,6,9,10,4]
l_1 = ['a','b','c','d','e']
l_2 = ['c','a','d','e','b']

score_dict = defaultdict(int)

'''
for note: 0

if your score is always consecutive
like score = [2,3,4,5,6] or [5,6,7,8,9]...
you don't need to have seperate list of score you can set
start = score_of_char_at_first_position_ie_at_zero-th_index

like start = 2, or start = 5

else use this function

def add2ScoreDict( lst):
    for pos_score, char in zip(score,lst):
        score_dict[char] += pos_score

'''

def add2ScoreDict( lst):
    for pos, char in enumerate( lst,start =1):
        score_dict[char] += pos


# note: 1
add2ScoreDict( l_1)
add2ScoreDict( l_2)

#print(score_dict) # defaultdict(<class 'int'>, {'a': 3, 'b': 7, 'c': 4, 'd': 7, 'e': 9})

score_dict = dict(sorted(score_dict.items(), reverse = True, key=lambda x: x[1]))

print(score_dict) # {'e': 9, 'b': 7, 'd': 7, 'c': 4, 'a': 3} 

edit 1:

, если у вас есть несколько списков, поместите их в list_of_list = [l_1, l_2], чтобы вам не приходилось вызывать func add2ScoreDict самостоятельно и снова.

# for note: 1
for lst in list_of_list:
    add2ScoreDict( lst)
0 голосов
/ 03 октября 2018

Вам лучше использовать zip функцию:

dic = {'a':0, 'b': 0, 'c':0, 'd': 0, 'e': 0}
def score(dic, *args):
    for lst in args:
        for k, v in zip(lst, range(len(lst))):
            dic[k] += v+1
    return dic

l_1 = ['a','b','c','d','e']
l_2 = ['c','a','d','e','b']

score(dic, l_1, l_2)
0 голосов
/ 03 октября 2018

Вы можете zip значения score для каждого списка, что дает вам кортеж (key, value) для каждой комбинации букв и очков.Сделайте каждый заархивированный объект dict.Затем используйте сложное понимание, чтобы сложить значения для каждого ключа вместе.

d_1 = dict(zip(l_1, score))
d_2 = dict(zip(l_2, score))

{k: v + d_2[k] for k, v in d_1.items()}
# {'a': 3, 'b': 7, 'c': 4, 'd': 7, 'e': 9}
...