Изменение элементов списка в цикле For - PullRequest
0 голосов
/ 20 ноября 2018

Этот скрипт работает для того, что мне нужно, но, изучая, как это сделать, я нашел много комментариев, что это неправильный способ сделать это. Комментарии, которые я нашел, не очень описательны и, кажется, не относятся к моему варианту использования. Я не могу разобраться, если или почему это неправильно, что я могу сделать, чтобы улучшить это?

myList1 = [1, 2, 3, 4, 5]
myList2 = [1, 3, 5]
myList3 = []

for i in myList1:
    myList3.append(0)
for j in range(len(myList1)):
    for k in range(len(myList2)):
        if myList1[j] == myList2[k]:
            myList3[j] = 1

print(myList3)

Мой вывод - это то, что я хочу:

[1, 0, 1, 0, 1]

Итак, я хочу, чтобы myList3 был такой же длины, как myList1, и заполнял его нулями.

Затем я хочу сравнить myList1 с myList2, и если есть совпадения, то этому номеру элемента myList1 будет присвоено некоторое значение.

Может быть, в этом нет ничего плохого, и причина, по которой я не могу найти ответ, в том, что он просто в порядке?

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Я имею в виду, технически, в этом нет ничего плохого.Немного странно, что вы используете for i in myList1:, поскольку вы на самом деле не используете i для чего-либо.Мне понравился ответ @ MisterMiyagi с точки зрения его краткости, но если вы просто ищете простой способ инициализации myList3, вы могли бы просто сделать myList3 = [0]*len(myList1).

0 голосов
/ 20 ноября 2018

Ваш код работает за O(len(myList1) * len(myList2)) время, что может стать проблемой, если списки достаточно велики (и случайные элементы равномерно распределены в myList2). Одной простой оптимизацией было бы превратить myList2 в набор заранее:

mySet2 = frozenset(myList2)
myList3 = [1 if element in mySet2 else 0 for element in myList1]

Этот код будет иметь значительно лучшее O(len(myList1) + len(myList2)) среднее время выполнения.

0 голосов
/ 20 ноября 2018

В вашем подходе нет ничего неправильного.Тем не менее, нет необходимости в таком большом явном цикле и тестировании:

myList1 = [1, 2, 3, 4, 5]
myList2 = [1, 3, 5]
myList3 = [1 if element in myList2 else 0 for element in myList1]

Это в основном объединяет два цикла, проходящих myList1 (один раз для 0 и один раз для сравнения), и удаляет цикл для поиска совпадений в myList2,Использование такого стиля, как правило, предпочтительнее, так как оно во многом зависит от того, что вы хотите, а не от того, как туда добраться.

Обратите внимание, что в зависимости от того, сколько у вас есть данных, вы хотите, чтобы myList2 было set,A set имеет постоянное время для поиска, тогда как list быстр для нескольких элементов, но замедляется с большим количеством элементов.

myList1 = [1, 2, 3, 4, 5]
mySet2 = {1, 3, 5}
myList3 = [1 if element in mySet2 else 0 for element in myList1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...