Создать словарь с 2 неравными списками - PullRequest
0 голосов
/ 22 марта 2020

Мне нравится формировать словарь с двумя списками, заголовком в качестве ключа и оценкой в ​​качестве значений:

#data
header= ["math","science","english"]
score = [80,95,75,81,22,90,20,55,99]

#my attempt
d={}
for i in header:
    print(i)
    for j in score:
        print(j)

Желаемый вывод -

{("math":80, 81, 20),("science":95,22,55),("english":75,90,99)}

Ответы [ 6 ]

3 голосов
/ 22 марта 2020
>>> {k: score[i::3] for i, k in enumerate(header)}
{'math': [80, 81, 20], 'science': [95, 22, 55], 'english': [75, 90, 99]}
1 голос
/ 22 марта 2020

Предполагая, что вы хотите, чтобы ваш вывод был действительным словарем. Тогда попробуйте это.

dict(zip(header,zip(*[score[i:i+3] for i in range(0,len(score),3)])))
# {'math': (80, 81, 20), 'science': (95, 22, 55), 'english': (75, 90, 99)}
1 голос
/ 22 марта 2020

Мы можем использовать zip в этом сценарии.

groups = [score[i::3] for i in range(0, len(header))]

dict(zip(header, groups))
{'english': [75, 90, 99], 'math': [80, 81, 20], 'science': [95, 22, 55]}
0 голосов
/ 22 марта 2020

вы можете использовать словарь и встроенную функцию и перечислять :

step = len(header)
{k : score[i::step] for i, k in enumerate(header)}

вывод:

{'math': [80, 81, 20], 'science': [95, 22, 55], 'english': [75, 90, 99]}

или вы можете использовать numpy:

import numpy as np

dict(zip(header, np.array(score).reshape(3,3).T.tolist()))

вывод:

{'math': [80, 81, 20], 'science': [95, 22, 55], 'english': [75, 90, 99]}

, если вы хотите использовать for петли:

result = {}
for i in range(len(score) // len(header)):
    for j, h in enumerate(header):
        result.setdefault(h, []).append(score[i * len(header) + j])

result

вывод:

{'math': [80, 81, 20], 'science': [95, 22, 55], 'english': [75, 90, 99]}
0 голосов
/ 22 марта 2020

Вы должны попытаться разделить вашу проблему на несколько более мелких проблем. Вот две ссылки на связанные вопросы и ответы на них здесь на переполнение стека:

  1. Как разбить Python список каждого N-го элемента

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

    >>> header = ["math", "science", "english"]
    >>> score = [80, 95, 75, 81, 22, 90, 20, 55, 99]
    >>> def slice_per(source, step):
    ...     return [source[i::step] for i in range(step)]
    ... 
    >>> slice_per(score, len(header))
    [[80, 81, 20], [95, 22, 55], [75, 90, 99]]
    
  2. Преобразование двух списков в словарь

    Объедините ломтики с заголовками:

    >>> dict(zip(header, slice_per(score, len(header))))
    {'math': [80, 81, 20], 'science': [95, 22, 55], 'english': [75, 90, 99]}
    
0 голосов
/ 22 марта 2020

У вас есть:

>>> header= ["math","science","english"]
>>> score = [80,95,75,81,22,90,20,55,99]

Первая идея - использовать zip, но zip останавливается, когда исчерпан самый короткий из двух списков:

>>> dict(zip(header, score))
{'math': 80, 'science': 95, 'english': 75}

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

>>> n = len(header)
>>> L = list(zip(*(score[i*n:(i+1)*n] for i in range(n))))
>>> L
[(80, 81, 20), (95, 22, 55), (75, 90, 99)]

, а затем zip header и сгруппированные оценки:

>>> dict(zip(header, L))
{'math': (80, 81, 20), 'science': (95, 22, 55), 'english': (75, 90, 99)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...