Использовать понимание списка / набора просто как цикл for?

Я создаю набор кортежей NUM_RECORDS в Python. Это мой код

record_key_list = {(choice(tuple(studentID_list)),
                   choice(tuple(courseID_list)),
                   randint(2012, 2016),
                   choice(semesters),
                   choice(grades)[0]) 
                   for no_use in range(NUM_RECORDS)}

Альтернатива - закодировать проблему следующим образом.

record_key_list = set()
while len(record_key_list) < NUM_RECORDS:
    record_key_list.add((choice(tuple(studentID_list)),
                        choice(tuple(courseID_list)),
                        randint(2012, 2016),
                        choice(semesters),
                        choice(grades)[0]))

Я рассчитал время для двух фрагментов кода, и они примерно такие же, как и для 20000 записей. Я предпочитаю первую версию кода стилистически.

Является ли первая версия кода правильным использованием заданного понимания? Или я всегда должен придерживаться второго метода?

РЕДАКТИРОВАТЬ: Улучшено форматирование, как предложено. Я в основном просто скопировал и вставил из IDE. Извините, ребята.

1 ответ

Решение

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

def random_record():
    studentID = choice(studentID_list)
    courseID = choice(courseID_list)
    year = randint(2012, 2016)
    semester = choice(semesters)
    grade = choice(grades)[0]
    return (studentID, courseID, year, semester, grade)

# ...

record_key_list = {random_record() for _ in range(NUM_RECORDS)}
Другие вопросы по тегам