-1

Hi i am writing a python code it throws error while i try to delete a value from the list

Here is my code

my_dict={}
my_dict["Fi"]={}
my_dict["Edge"]={}

version = {"4.5(2a)", "4.5(1a)", "4.5(1a)","4.0(2e)","4.0(2d)","4.0(2c)","4.0(2b)","4.0(2a)","4.0(2f)","3.5(2g)","3.5(2h)","3.5(2i)"}
model = {"Fi": ["HX220c M5","HX240c M5","HX220c All NVMe M5","HX220c AF M5","HX240c AF M5","HX220c M4","HX240c M4","HX220c AF M4","HX240c AF M4"], "Edge": ["HX220c Edge M5","HX220c Edge M4","HX240c M5","HX240c AF M5","HX240c M5 SD","HX240c AF M5 SD",]}

fi=model["Fi"]
edge=model["Edge"]


for i in version:
    if i not in my_dict["Fi"]:
        my_dict["Fi"][i]=fi
        
    if i not in my_dict["Edge"]:
        my_dict["Edge"][i]=edge
        if i < "4.0(2c)":
            my_dict["Edge"][i].remove("HX240c M5 SD")

The error is a as follows

Traceback (most recent call last):
  File "main.py", line 25, in <module>
    my_dict["Edge"][i].remove("HX240c M5 SD")    
ValueError: list.remove(x): x not in list

Please Help

This is the output of print(my_dict["Edge"][i])

['HX220c Edge M5', 'HX220c Edge M4', 'HX240c M5', 'HX240c AF M5', 'HX240c M5 SD', 'HX240c AF M5 SD']
['HX220c Edge M5', 'HX220c Edge M4', 'HX240c M5', 'HX240c AF M5', 'HX240c M5 SD', 'HX240c AF M5 SD']
['HX220c Edge M5', 'HX220c Edge M4', 'HX240c M5', 'HX240c AF M5', 'HX240c M5 SD', 'HX240c AF M5 SD']
['HX220c Edge M5', 'HX220c Edge M4', 'HX240c M5', 'HX240c AF M5', 'HX240c M5 SD', 'HX240c AF M5 SD']
['HX220c Edge M5', 'HX220c Edge M4', 'HX240c M5', 'HX240c AF M5', 'HX240c M5 SD', 'HX240c AF M5 SD']
GPhilo
  • 18,519
  • 9
  • 63
  • 89
Tony Frank
  • 248
  • 1
  • 2
  • 8
  • You're trying to remove a value that was not in the list in the first place. – GPhilo Jul 19 '21 at 08:53
  • if i print it its there['HX220c Edge M5', 'HX220c Edge M4', 'HX240c M5', 'HX240c AF M5', 'HX240c M5 SD', 'HX240c AF M5 SD'] ['HX220c Edge M5', 'HX220c Edge M4', 'HX240c M5', 'HX240c AF M5', 'HX240c M5 SD', 'HX240c AF M5 SD'] ['HX220c Edge M5', 'HX220c Edge M4', 'HX240c M5', 'HX240c AF M5', 'HX240c M5 SD', 'HX240c AF M5 SD'] ['HX220c Edge M5', 'HX220c Edge M4', 'HX240c M5', 'HX240c AF M5', 'HX240c M5 SD', 'HX240c AF M5 SD'] ['HX220c Edge M5', 'HX220c Edge M4', 'HX240c M5', 'HX240c AF M5', 'HX240c M5 SD', 'HX240c AF M5 SD'] – Tony Frank Jul 19 '21 at 08:56
  • Is it possible that you're running the line twice? It removes it the first time, but then it runs again and raises the error. – GPhilo Jul 19 '21 at 08:58

1 Answers1

0

When you do my_dict["Edge"][i]=edge you don't create a copy of edge. edge just got the additional name my_dict["Edge"][i].

So what happens is that during your first loop you do my_dict["Edge"][i].remove("HX240c M5 SD"). Since my_dict["Edge"][i] is the same as edge you get a problem with the second loop. Here you do my_dict["Edge"][i]=edge with a new value for i again, but "HX240c M5 SD" was already removed from edge during the first loop. Removing it again won't work.

You need to copy edge.

my_dict = {
    "Fi": {},
    "Edge": {}
}

version = {"4.5(2a)", "4.5(1a)", "4.5(1a)", "4.0(2e)", "4.0(2d)", "4.0(2c)", "4.0(2b)", "4.0(2a)", "4.0(2f)", "3.5(2g)", "3.5(2h)", "3.5(2i)"}
model = {"Fi": ["HX220c M5", "HX240c M5", "HX220c All NVMe M5", "HX220c AF M5", "HX240c AF M5", "HX220c M4", "HX240c M4", "HX220c AF M4", "HX240c AF M4"], "Edge": ["HX220c Edge M5", "HX220c Edge M4", "HX240c M5", "HX240c AF M5", "HX240c M5 SD", "HX240c AF M5 SD", ]}

fi = model["Fi"]
edge = model["Edge"]

for i in version:
    if i not in my_dict["Fi"]:
        my_dict["Fi"][i] = fi

    if i not in my_dict["Edge"]:
        my_dict["Edge"][i] = edge.copy()  # <-- change is here
        if i < "4.0(2c)":
            print(i, my_dict['Edge'])
            my_dict["Edge"][i].remove("HX240c M5 SD")

You can find more information at List changes unexpectedly after assignment. Why is this and how can I prevent it?. Some more knowledge can be found here: Python Names and Values.

Matthias
  • 12,873
  • 6
  • 42
  • 48