удалить значения в словаре в Python - PullRequest
0 голосов
/ 24 сентября 2018

Почему этот код не идет ко второму «если часть», но когда я закомментирую операторы удаления, то он идет ко второму «если часть», мне нужно убрать «abc» и «abcd» и «defg»'из d [' a '] ниже мой код.

d={'a': ['abc','def','ghi','abcd','ghij'], 'b': [6, 7, 8]}
for i in d['a']:
    if i.startswith("a"):
        d['a'].remove(i)
        #print('1st print '+i)
    if i.startswith("d"):
        d['a'].remove(i)
        #print('2nd print '+i)
print(d)

Ответы [ 2 ]

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

Работает нормально, если вы удаляете элементы из списка при переборе его reversed() версии.

d={'a': ['abc','def','ghi','abcd','ghij'], 'b': [6, 7, 8]}
for i in reversed(d['a']):
    if i.startswith("a"):
        d['a'].remove(i)
        #print('1st print '+i)
    if i.startswith("d"):
        d['a'].remove(i)
        #print('2nd print '+i)
print(d)

Вывод: {'a': ['ghi', 'ghij'], 'b': [6, 7, 8]}

Это происходит потому, что при удалении элементаи итерируйте от start списка, элементы, которые вы еще не проверили , могут изменить свою позицию в списке.Этого не происходит при итерации в обратном порядке, начиная с end .

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

Не рекомендуется удалять элемент из списка во время итерации по нему.В вашем случае вы можете использовать простое понимание списка.

Пример:

d={'a': ['abc','def','ghi','abcd','ghij'], 'b': [6, 7, 8]}
d["a"] = [i for i in d["a"] if not i.startswith(("a", "d"))]

print(d)

Выход:

{'a': ['ghi', 'ghij'], 'b': [6, 7, 8]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...