【问题标题】:filtering a list of dictionaries using list comprehension使用列表推导过滤字典列表
【发布时间】:2022-01-13 23:44:04
【问题描述】:

我想要两个列表。一份列出当天所有行情的清单,一份列出当天所有行情的清单。

给定:

stocks = [{'ticker':'IBM', 'open': 139.50, 'close': 125.32},
          {'ticker':'NIO', 'open': 43.80, 'close': 40.30},
          {'ticker':'WMT', 'open': 134.80, 'close': 130.23},
          {'ticker':'GE', 'open': 10.13, 'close': 10.50}] 

我尝试了以下方法;并且,它有效;但是,有没有更好的方法?

stocks_down_list = [stocks[x]['ticker'] for x in range(len(stocks)) if stocks[x]['close'] -stocks[x]['open'] < 0]

stocks_up_list = [stocks[x]['ticker'] for x in range(len(stocks)) if stocks[x]['close'] - stocks[x]['open'] > 0] 

【问题讨论】:

    标签: python list list-comprehension


    【解决方案1】:

    当然可以对哪种“更好”的方式进行解释,但是为了降低时间复杂度,您绝对可以考虑对股票列表进行一次迭代,而不是两次通过理解方法分别构建每个 list .

    例如:

    stocks = [{'ticker': 'IBM', 'open': 139.50, 'close': 125.32},
              {'ticker': 'NIO', 'open': 43.80, 'close': 40.30},
              {'ticker': 'WMT', 'open': 134.80, 'close': 130.23},
              {'ticker': 'GE', 'open': 10.13, 'close': 10.50}]
    
    stocks_up_list = []
    stocks_down_list = []
    
    for stock in stocks:
        ticker = stock['ticker']
        if stock['close'] >= stock['open']:
            stocks_up_list.append(ticker)
        else:
            stocks_down_list.append(ticker)     
    

    【讨论】:

      【解决方案2】:

      您可以使用下面的代码只迭代一次更简洁的股票列表

      for stock in stocks:
        (stocks_up_list, stocks_down_list)[stock['close'] < stock['open']].append(stock)
      

      【讨论】:

      • 这很聪明。我花了一段时间才明白它是如何工作的。但基本上,您有一个 2 元素元组作为对列表的引用,bool 条件允许您“选择”要附加到的列表。也就是说,当条件为True 时,它将附加到第二个列表stocks_down_list,因为 bool 是 int 的子类,而 True 与 int 值 1 相同。再次,非常聪明。
      猜你喜欢
      • 2021-05-01
      • 2017-04-23
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多