Как найти все разные списки и поместить их в другой список - PullRequest
0 голосов
/ 06 мая 2020

У меня есть файл .csv с 1500 строками, и каждая строка выглядит так:

CS105,A-,ENG101,A-,MATH101,A,GER,B,ENG102,B,CS230,B,MATH120,B,GER,A-,CS205,A,FREE,A-,GER,A-,CS106,B,CS215,B+,CS107,A,ENG204,A-,GER,A-,MATH220,B+,CS300,B,CS206,A,CS306,B+,GER,A-,FREE,B+,CS312,A,CS450,B,GER,B,CS321,B,FREE,A,CS325,A-,GER,B+,CS322,B+,MAJOR,A-,CS310,B,STAT205,A-,A-,CS443,B+,CS412,A,CS421,B+,GER,A-,CS444,B+,FREE,A-,FREE,B,A,B,A-

и следующая строка примерно так:

CS105,A-,ENG101,A,MATH101,B,GER,A,ENG102,A-,CS230,B+,MATH120,A-,GER,B,CS205,B+,GER,B+,A,CS106,A-,CS107,B+,CS215,A-,ENG204,A,GER,B,MATH220,A-,CS206,A-,FREE,A-,CS300,B,GER,B+,A,CS312,A,CS450,A-,GER,B,CS321,A,FREE,A-,CS325,B+,CS306,B,CS310,B+,MAJOR,A,GER,A,STAT205,B,B,CS443,A,CS322,B,GER,A,FREE,B,CS444,A,CS412,A,CS421,B+,FREE,A,FREE,B,A-

и так далее. CS105 указывает курс, а A- указывает оценку, полученную учащимся в этом c классе. Что я сделал, так это отделил курсы от оценок, и я сделал это

courses = []
grades = []

def DatabaseToList():

    with open('grades.csv', newline='') as f:
        reader = csv.reader(f)
        mylist = list(reader)
        # print(mylist)

        path = mylist[0:]
        for lists in path:
            for onelist in lists:
                course = lists[::2]
                grade = lists[1::2]
                courses.append(course)
                grades.append(grade)

Таким образом я получаю этот результат (я просто показываю курсы [0] и оценки [0]):

['CS105', 'ENG101', 'MATH101', 'GER', 'ENG102', 'CS230', 'MATH120', 'GER', 'CS205', 'FREE', 'GER', 'CS106', 'CS215', 'CS107', 'ENG204', 'GER', 'MATH220', 'CS300', 'CS206', 'CS306', 'GER', 'FREE', 'CS312', 'CS450', 'GER', 'CS321', 'FREE', 'CS325', 'GER', 'CS322', 'MAJOR', 'CS310', 'STAT205', '', 'CS443', 'CS412', 'CS421', 'GER', 'CS444', 'FREE', 'FREE']
['A-', 'A-', 'A', 'B', 'B', 'B', 'B', 'A-', 'A', 'A-', 'A-', 'B', 'B+', 'A', 'A-', 'A-', 'B+', 'B', 'A', 'B+', 'A-', 'B+', 'A', 'B', 'B', 'B', 'A', 'A-', 'B+', 'B+', 'A-', 'B', 'A-', '', 'B+', 'A', 'B+', 'A-', 'B+', 'A-', 'B']

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

unique_list = []
duplicate_list = []
for i in courses:
    final_list = [unique_list.append(item) if item not in unique_list else duplicate_list.append(item) for item in
                          courses]

Другими словами, чтобы упростить понимание, если существует массив курсов, в котором есть:

courses = [[A,B,C],[A,B,C],[A,C,B],[B,C,A],[B,A,C],[B,A,C]]

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

 allUnique = [[A,B,C],[A,C,B],[B,C,A],[B,A,C]]

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Самое быстрое решение - использовать itertools:

import itertools

courses = [[A,B,C],[A,B,C],[A,C,B],[B,C,A],[B,A,C],[B,A,C]]
courses.sort()
allUnique = list(course for course, _ in itertools.groupby(courses))
print(allUnique)  # [[A,B,C],[A,C,B],[B,C,A],[B,A,C]]
0 голосов
/ 06 мая 2020

Чтобы взять список,

a = [[A,B], [A,B], [B,C]]

в

[[A,B], [B,C]]

вы можете сделать

list(set(map(tuple,a)))

Поскольку вы не можете использовать set на 2d массивах, вы сначала конвертируете его в кортеж, затем выполняете для него функцию set и, наконец, конвертируете его обратно в список.

Надеюсь, что это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...