Python Forum

Full Version: List and loop
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I am not getting expected output? Why?
phrase="don't panic"
plist=list(phrase)
str1="on tap"
qlist=list(str1)
for item in qlist:
    if item not in plist:
        plist.remove(item)
print(plist)
Output:
Output:
['o', 'n', 't', ' ', 'p', 'a', 'n', 'c']
Desired output:
I want program to remove characters from plist which are not in qlist list.
Output:
['o', 'n', “‘”, 't','p', ‘a’, ‘n’]
(Oct-23-2019, 05:51 AM)Sandeep2000 Wrote: [ -> ]I am not getting expected output? Why?
define expected output in plain english, please
If you want items in both lists, use set union https://www.programiz.com/python-programming/set#union
(Oct-23-2019, 07:27 AM)woooee Wrote: [ -> ]If you want items in both lists, use set union https://www.programiz.com/python-programming/set#union
Thank you for suggesting better ways. I know there are many ways to do this simple task.
But can i expect that output from code above? Can you see if there is something wrong with the code itself.

Sorry i misplaced plist and qlist.
phrase="don't panic"
plist=list(phrase)
str1="on tap"
qlist=list(str1)
for item in plist:
    if item not in qlist:
        plist.remove(item)
print(plist)
Sandeep2000 Wrote:Can you see if there is something wrong with the code itself.
Yes something is fundamentally wrong in this code: Don't remove items in a python list inside a loop that's iterating on this list. To avoid this, try for item in list(plist), which iterates on a copy of the initial list.
Main problem with your code is that you mutate the list while iterating over it (it can be done but you must know and understand what are you doing):

Quote:"If fact, in any programming language for most part if you mutate something while you iterating over it you living in state of sin and you deserve whatever happens to you" -- Raymond Hettinger, Python core-developer, Transforming Code into Beautiful, Idiomatic Python

If your objective is: 'give me list of all chars in phrase which are in str1' then one can skip all conversions etc and have list comprehension:

>>> phrase="don't panic"
>>> str1="on tap"
>>> [char for char in phrase if char in str1]
['o', 'n', 't', ' ', 'p', 'a', 'n']