Понимание списка из 3 вложенных циклов, и вывод основан на условии if-else - PullRequest
0 голосов
/ 27 сентября 2018

Возможно ли преобразовать это в понимание списка?Например, у меня есть список v. В приведенном ниже исходном коде v = dictionary.keys ()

v = ["naive", "bayes", "classifier"]

У меня есть следующий вложенный список t.

t = [["naive", "bayes"], ["lol"]]

ОжидаемыйВывод O должен быть:

O = [[1 1 0], [0 0 0]]

1, если словарь содержит слово, и 0, если нет.Я создаю матрицу функций спама / ветчины.Из-за большого набора данных я хотел бы преобразовать приведенный ниже код в понимание списка для более быстрой итерации.

ham_feature_matrix = []
for each_file in train_ham:
    feature_vector = [0] * len(dictionary)
    for each_word in each_file:
        for d,dicword in enumerate(dictionary.keys()):
            if each_word == dicword:
                feature_vector[d] = 1
    ham_feature_matrix.append(feature_vector)

1 Ответ

0 голосов
/ 27 сентября 2018

Я не смог проверить это, но это переводится как:

ham_feature_matrix = [[[int(each_word == dicword) for dicword in dictionary] for each_word in each_file] for each_file in train_ham]

[int(each_word == dicword) for dicword in dictionary] - это часть, которая больше всего изменяется по сравнению с вашим исходным кодом.

По сути, так как выперебирая слова словаря, вам не нужно enumerate, чтобы установить соответствующие слоты на 1.Понимание создает список с результатом сравнения, равным 0 или 1 при преобразовании в целые числа.Вам не нужно получать ключи, поскольку итерации по словарю итерируют ключи по умолчанию.

Остальные циклы тривиальны.

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

...