Проверка того, содержит ли ряд списков элементы

#python #list #stock

Вопрос:

У меня есть набор данных, который я пытаюсь просмотреть и отфильтровать только для «обменов», которые я ищу. Я пробовал any() , но, похоже, это не работает. Может кто-нибудь, пожалуйста, сообщить мне, что я делаю неправильно?

Мой желаемый результат-это список, содержащий "NASDAQ" или "NYSE" .

 exchanges = ['NASDAQ', 'NYSE']

for i in ticker_csv:
    if any(exchanges) in i:
        print(i)
 

Это ничего не печатает, так как мои условия не были выполнены.

Вот образец данных внутри ticker_csv .

 ['ZVZZC', 'ZVZZC', 'NASDAQ', 'Stock', '2016-01-29', 'null', 'Active']
['ZVZZT', 'NASDAQ TEST STOCK', 'Bats', 'Stock', '2017-09-22', 'null', 'Active']
['ZWRK', 'Z-Work Acquisition Corp - Class A', 'NASDAQ', 'Stock', '2021-04-05', 'null', 'Active']
['ZWRKU', 'Z-Work Acquisition Corp - Units (1 Ord Class A amp; 1/3 War)', 'NASDAQ', 'Stock', '2021-01-29', 'null', 'Active']
['ZWRKW', 'Z-Work Acquisition Corp - Warrants (29/01/2026)', 'NASDAQ', 'Stock', '2021-03-24', 'null', 'Active']
['ZWZZT', 'NASDAQ TEST STOCK', 'W', 'Stock', '2017-09-22', 'null', 'Active']
['ZXYZ-A', 'NASDAQ SYMBOLOGY TEST', 'NASDAQ', 'Stock', '2016-01-19', 'null', 'Active']
['ZXZZT', 'NASDAQ TEST STOCK', 'Bats', 'Stock', '2006-07-10', 'null', 'Active']
['ZY', 'Zymergen Inc', 'Bats', 'Stock', '2021-04-22', 'null', 'Active']
['ZYME', 'Zymeworks Inc', 'MKT', 'Stock', '2017-04-28', 'null', 'Active']
['ZYNE', 'Zynerba Pharmaceuticals Inc', 'bats', 'Stock', '2015-08-05', 'null', 'Active']
['ZYXI', 'Zynex Inc', 'NASDAQ', 'Stock', '2002-12-31', 'null', 'Active']
['ZZK', '', 'NYSE ARCA', 'Stock', '2020-07-22', 'null', 'Active']
['ZZZ', 'TEST TICKER FOR UTP', 'NYSE ARCA', 'Stock', '2014-10-31', 'null', 'Active']

 

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

1. Вас интересуют только точные совпадения с учетом регистра? Как насчет частичных совпадений (например NYSE ARCA , NASDAQ TEST STOCK )?

Ответ №1:

Проблема с вашим исходным кодом заключается в том, что встроенная any функция предназначена для того, чтобы принимать последовательность логических значений и возвращать значение True, если какое-либо из них является истинным, но вы передали ей список обменов.

Вместо этого вы должны проверить, присутствует ли каждый обмен в данных, и использовать any его, чтобы выяснить, верно ли это для одного или нескольких обменов:

 for data in ticker_csv:
    if any(exchange in data for exchange in exchanges):
        print(data)
 

Здесь data приведен список, содержащий несколько полей: символ тикера, полное имя, биржа и т.д.

Лучший подход состоит в том, чтобы отметить, что биржа всегда является третьим элементом списка (индекс 2). Так что вы можете сделать что-то вроде этого:

 for data in ticket_csv:
    exchange = data[2]
    if exchange in exchanges:
        print(data)
 

Более сжатая версия выполняет эту фильтрацию с помощью встроенной filter функции:

 for data in filter(lambda data: data[2] in exchanges, ticker_csv):
    print(data)
 

Вы также можете использовать data[2].upper() , если вам нужно провести сравнение без учета регистра, предполагая, что ваш список обменов вверху полностью прописан.