【问题标题】:loop only deleting two items?循环只删除两个项目?
【发布时间】:2021-02-20 16:54:10
【问题描述】:

我有一个网络爬虫,可以从 TradingView.com 下载满足特定条件的所有股票,然后将这些股票的名称存储在一个列表中。 然后,我有一个脚本可以将股票名称及其添加日期保存到 CSV 文件中。

我的问题是为什么我需要多次遍历列表来删除不相关的数据?我尝试使用两个列表来避免编辑您当前正在循环的列表。

代码如下:

# 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)]

如果我删除顶部的for i in range,它只会删除两个不相关的股票。

to_be_addedold_stocks 都是同一个列表,我使用它们来避免编辑我当前循环的列表,如上所述。 new_stocks 是来自网络爬虫的股票名称列表。 old_stocks 是一个包含嵌套列表的列表(导入的 CSV 文件),其中包含添加到文件中的股票名称和日期。

# 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']] 

【问题讨论】:

    标签: python loops csv


    【解决方案1】:

    列表上的迭代器只是使用索引循环的包装器,删除一个元素会移动整个列表。假设您有列表 [1, 2, 3],然后开始对其进行迭代:

    [1, 2, 3]
     ^ iterator here
    

    然后,删除元素,迭代器前进到槽 2:

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

    如果您想让to_be_added 成为old_stocks 的副本,那么您必须使用to_be_added = old_stocks.copy()。由于蟒蛇copies by reference。或者,只需使用列表理解过滤:

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

    【讨论】:

    • 谢谢,但为什么我在使用列表解析时在最后一个方括号处出现语法错误?
    【解决方案2】:

    制作一份副本,因为 del to_be_added 已将其从 old_stocks 中删除

    for i in range(5):
        to_be_added = old_stocks.copy()
        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)]
                
    

    您的要求不是很清楚。您可以使用列表推导以 Python 方式实现您的目标

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      • 2019-11-05
      相关资源
      最近更新 更多