Преобразование значений dict в целые числа, когда не все значения являются целыми числами python - PullRequest
0 голосов
/ 09 июля 2020

У меня есть этот код, который дает мне списки с ключами: значениями. Во-первых, я получаю доступ к ключу 'symbol', чтобы отфильтровать все, кроме списков, значения «символа» которых заканчиваются на *** BT C. Во-вторых, я пытаюсь получить доступ к ключу 'quoteVolume' и отфильтровать все списки, которые имеют значение ниже, например 100. Проблема возникает здесь, поскольку значения списка являются как строками, так и числами, а внутри строк находятся как буквы, так и числа. И значение 'quoteVolume' является строкой.

Код:

import requests

#gets list with key and value data for all ticker pairs
data = requests.get('https://www.binance.com/api/v3/ticker/24hr')
dataJson = data.json()

#takes value from key 'symbol', can now search for certain symbols
dataDictionary = {d['symbol'] : d for d in dataJson}

#filters out everything but pairs that end with ***BTC
BTC_markets = dict(filter(lambda pair: pair[0][-3:] == 'BTC', dataDictionary.items()))

#filters lists with < 100 quoteVolume
high_volume_BTC_markets =  dict(filter(market_filter(['quoteVolume']),BTC_markets.items()))

print('Active high volume BTC Markets: ')
pprint(high_volume_BTC_markets)

Списки примерно 100x, и 1 выглядит так

Выход BTC_markets:

 'STMXBTC': {'askPrice': '0.00000023',
             'askQty': '58640610.00000000',
             'bidPrice': '0.00000022',
             'bidQty': '130870153.00000000',
             'closeTime': 1594290726823,
             'count': 2842,
             'firstId': 66352,
             'highPrice': '0.00000024',
             'lastId': 69193,
             'lastPrice': '0.00000022',
             'lastQty': '2109909.00000000',
             'lowPrice': '0.00000022',
             'openPrice': '0.00000022',
             'openTime': 1594204326823,
             'prevClosePrice': '0.00000022',
             'priceChange': '0.00000000',
             'priceChangePercent': '0.000',
             'quoteVolume': '162.70619311',
             'symbol': 'STMXBTC',
             'volume': '713198749.00000000',
             'weightedAvgPrice': '0.00000023'},

Итак, как я могу преобразовать все списки quoteVolume значение из str в ìnt, не получая сообщения об ошибке, потому что не все строки можно превратить в числа?

Я очень новичок в этом и искал хорошие пару дней до публикации, я пробовал разные методы, с которыми я столкнулся, но не нашел ничего, что работает.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 09 июля 2020
def convert_to_int(d):
    for k, v in d.items():
        if isinstance(v, dict):
            convert_to_int(v)
        else:
            try:
                d[k] = int(float(v)) # or just float(v) for floating point conversion:
            except Exception:
                pass # ignore conversion errors and keep original value

convert_to_int(BTC_markets)
print(BTC_markets)

Теперь, чтобы получить list всех quoteVolume значений в самых верхних словарях:

quoteVolumes = [(k, BTC_markets[k]['quoteVolume']) for k in BTC_markets]
filtered_quoteVolumes = filter(lambda item: item[1] >= 100, quoteVolumes)
new_dict = dict(filtered_quoteVolumes)
0 голосов
/ 09 июля 2020

Ну, quoteVolume выглядит как '162.70619311', который является строкой, содержащей число с плавающей запятой, поэтому вы не можете напрямую использовать int(), вам нужно сначала использовать float(), например:

value = int(float(your_quote_volume))

Делая это, вы покрываете его полом, чтобы он стал 162. Если вам нужно сохранить десятичную дробь, не делайте int().

...