loop only deleting two items?

Harry Taylor

I have a webscraper to download all the stocks from TradingView.com that meet a certain criteria, then stores the names of these stocks in a list. I then have a script to save the names of the stocks along with the date they were added, into a CSV file.

My question is why do I need to loop through a list multiple times to remove the irrelevant data? I've tried using two lists to avoid editing a list you are currently looping through.

Here's the code :

# Removes irrelevant, old stocks
for i in range(5):
    to_be_added = old_stocks
    for stock in old_stocks:
        if stock[0] not in new_stocks:
            print(f"Removed irrelevant stock : {stock}")
            del to_be_added[old_stocks.index(stock)]

If I remove the for i in range at the top, It only removes two irrelevant stocks.

to_be_added and old_stocks are both the same list, I use them to avoid editing a list I'm currently looping through as stated above. new_stocks is a list of stock names from the webscraper. old_stocks is a list (imported CSV file) containing nested lists containing the stock names and dates added to the file.

# An example of new_stocks
['NASDAQ:CMBG', 'NASDAQ:GLG', 'NASDAQ:KTCC']

# An example of old_stocks
[['NASDAQ:CBMG', 'November 07, 2020'], ['NASDAQ:GLG', 'November 08, 2020'], ['NASDAQ:KTCC', 'November 08, 2020'], ['NASDAQ:ATHE', 'November 08, 2020']] 
Aplet123

Iterators over lists are just wrappers over looping with the index, and deleting an element shifts the entire list. Let's say you have the list [1, 2, 3], and you start iterating over it:

[1, 2, 3]
 ^ iterator here

Then, you delete the element and the iterator advances to slot 2:

[2, 3]
    ^ iterator here, 2 got skipped

If you meant for to_be_added to be a copy of old_stocks, then you have to use to_be_added = old_stocks.copy(). Since python copies by reference. Alternatively, just use list comprehension filtering:

to_be_added = [stock for stock in old_stocks if stock[0] not in new_stocks]

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related