Сравнение списка Python создает бесконечный цикл - PullRequest
0 голосов
/ 24 апреля 2018

Итак, назначение: возьмите 2 списка и напишите программу, которая возвращает список, который содержит только элементы, общие для списков без дубликатов, и он должен работать со списками разных размеров.

Мой код:

a = [1, 2, 4]
b = [3, 1, 5, 2]

for j < len(a):
    for i < len(b):
        if a(elem) == b(i):
            print (a(elem))
        i=i+1
    j=j+1

Затем генерируется бесконечный цикл, где он печатает 1, а затем никогда не завершается.

Может кто-нибудь сказать мне, почему происходит бесконечный цикл?

Я понимаю, что это не самый "питонный" способ выполнения вещей, однако мой фон кодирования включает в себя очень маленькую, грубую технику C, и я немного знаю Python.

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

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Я думаю, вы хотите сделать что-то вроде этого:

a = [1, 2, 4]
b = [3, 1, 5, 2]
j=0
while j < len(a):
print("J:", j)
i = 0
while i < len(b):
    print("I:", i)
    if j == i:
        print ("match :", a[j], b[i])
    i=i+1
j=j+1

или с for (и более симпатично):

a = [1, 2, 4]
b = [3, 1, 5, 2]

for j in a:
    print("J:", j)
    for i in b:
        print("I:", i)
        if j == i:
            print ("match :", a[j], b[i])

Это будет отображать индексы, где значения равны.

0 голосов
/ 24 апреля 2018

, если вы хотите использовать списочное понимание, используйте что-то вроде этого

[i for i in a if i in b]

, которое выводит

>>> a = [1, 2, 4]
>>> b = [3, 1, 5, 2]
>>> [i for i in a if i in b]
[1, 2]

>>> b = [1, 2, 4]
>>> a = [3, 1, 5, 2]
>>> [i for i in a if i in b]
[1, 2]

Или используйте решение @ Chris_Rand's Clean set:

>>> a = [1, 2, 4]
>>> b = [3, 1, 5, 2]
>>> list(set(a).intersection(b))
[1, 2]

Так как я первоначально думал, что название говорит о понимании списка, я дал вам ответ о понимании списка.Вы должны абсолютно использовать решение Криса, хотя.

Вот (не статистически значимый) тест, показывающий, почему

>>> a = list(np.random.randint(0, 10000, size=500))
>>> b = list(np.random.randint(0, 10000, size=800))

>>> timeit.timeit(stmt='[i for i in a if i in b]', globals=globals(), number=1000)
9.176704404999327

>>> timeit.timeit(stmt='list(set(a).intersection(b))', globals=globals(), number=1000)
0.05484662300295895
...