фильтрация списка словарей с использованием понимания списка

#python #list #list-comprehension

#питон #Список #список-понимание

Вопрос:

Мне нужны два списка. Один список, в котором указаны все тикеры за день, и один список, в котором указаны все тикеры за день.

Дано:

 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'] lt; 0]  stocks_up_list = [stocks[x]['ticker'] for x in range(len(stocks)) if stocks[x]['close'] - stocks[x]['open'] gt; 0]   

Ответ №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'] gt;= 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'] lt; stock['open']].append(stock)  

Комментарии:

1. Это довольно умно. Мне потребовалось некоторое время, чтобы понять, как это работает; но в основном у вас есть кортеж из 2 элементов, который действует как ссылка на списки, и bool условие позволяет вам «выбрать», к какому списку вы хотите добавить. То есть, когда условие True выполнено , оно будет добавлено ко второму списку stocks_down_list , поскольку bool является подклассом int, а значение True совпадает со значением int 1. Опять же, довольно умно.