isinstance в списке, содержащем int и str

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

x = 0
list1 = ["a", "b", "c", 1, 2, 3, 4, 5, 6, "d", 7]
list2 = []
for item in list1:
    if isinstance(item, int):
        list2.append(item)
        list1.pop(x)
    x +=  1
list1
list2

Результат не тот, что я ожидаю:

list1
['a', 'b', 'c', 2, 4, 6, 'd']
list2
[1, 3, 5, 7]

Я не понимаю, почему условие ложно для 2-х последовательных номеров из списка, это из-за объявленного пути?


person Ștefan Ciobanu    schedule 17.03.2021    source источник
comment
Отвечает ли это на ваш вопрос? Изменение списка во время итерации   -  person Brian    schedule 17.03.2021
comment
И еще один дубликат и другой и другой   -  person Brian    schedule 17.03.2021
comment
Это потому, что вы используете pop в цикле for. Вы не можете сделать это вот так. Вместо этого просто создайте 2 новых списка.   -  person Justin Oberle    schedule 17.03.2021
comment
@ Брайан, извини, в следующий раз я постараюсь усерднее, мне также не нравятся люди, которые спрашивают сразу после того, как у них есть вопрос. В нагиле - не работает, когда вы удаляете / выталкиваете элемент, все оставшиеся элементы перемещаются назад и на следующей итерации. вы перепрыгиваете через один предмет. Спасибо всем, я удивлен, что нашел ответ так быстро.   -  person Ștefan Ciobanu    schedule 17.03.2021
comment
просто сделайте понимание списка, list2 = [x for x in list1 if isinstance(x, int)] list1 = [x for x in list1 if isinstance(x, str)]   -  person Shijith    schedule 17.03.2021


Ответы (2)


list1 = ["a", "b", "c", 1, 2, 3, 4, 5, 6, "d", 7]
integers = []
strings = []

for item in list1:
    if isinstance(item, int):
        integers.append(item)
    elif isinstance(item, str):
        strings.append(item)

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

person Jelle    schedule 17.03.2021

list1 = ["a", "b", "c", 1, 2, 3, 4, 5, 6, "d", 7]
list2 = []
list3 = []
for item in list1:
    if isinstance(item, int):
        list2.append(item)
    elif isinstance(item, string):
        list3.append(item)

Вместо использования pop для удаления индексов в списке просто создайте новый список. Когда вы удаляете значение из списка, который вы просматриваете, итерации путаются. Лучше этого не делать.

person Justin Oberle    schedule 17.03.2021