Как я могу использовать словарь для хранения нескольких значений в двух разных массивах - PullRequest
1 голос
/ 08 июня 2019

Я хочу сохранить значения цены последней сделки для производной котировки INFOSYS и RELIANCE в двух разных списках.После этого я хочу, чтобы моя программа вычла два последних значения из соответствующего списка и предоставила вывод в виде разницы между значениями.Данный код обеспечивает вывод для одной производной кавычки.

Как можно использовать один код для получения желаемого результата из нескольких списков?Могу ли я использовать словарь для решения проблемы?

import requests
import json
import time
from bs4 import BeautifulSoup as bs
import datetime, threading


LTP_arr=[0]
url = 'https://nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuoteFO.jsp?underlying=INFY&instrument=FUTSTK&expiry=27JUN2019&type=-&strike=-'

def ltpwap():
    resp = requests.get(url)
    soup = bs(resp.content, 'lxml')
    data = json.loads(soup.select_one('#responseDiv').text.strip())

    LTP=data['data'][0]['lastPrice']
    n2=float(LTP.replace(',', ''))

    LTP_arr.append(n2)
    LTP1= LTP_arr[-1] - LTP_arr[-2]

    print("Difference between the latest two values of INFY is ",LTP1)
    threading.Timer(1, ltpwap).start()

ltpwap()

, который дает:

Difference between the latest two values of INFY is 4.

Ожидаемый результат:

INFY_list = (729, 730, 731, 732, 733)
RELIANCE_list = (1330, 1331, 1332, 1333, 1334)    

1 Ответ

0 голосов
/ 21 июня 2019

Лучше, чем хранить некоторые списки, - просто создавать генераторы, которые выдают желаемое значение из URL через некоторый интервал. Вот реализация с time.sleep(), но со многими URL я бы посоветовал посмотреть на asyncio:

from bs4 import BeautifulSoup as bs
import json
import requests
from collections import defaultdict
from time import sleep

urls_to_watch = {
    'INFOSYS': 'https://nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuoteFO.jsp?underlying=INFY&instrument=FUTSTK&expiry=27JUN2019&type=-&strike=-',
    'RELIANCE': 'https://nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuoteFO.jsp?underlying=RELIANCE&instrument=FUTSTK&expiry=27JUN2019&type=-&strike=-'
}

def get_values(urls):
    for name, url in urls.items():
        resp = requests.get(url)
        soup = bs(resp.content, 'lxml')
        data = json.loads(soup.select_one('#responseDiv').text.strip())

        LTP=data['data'][0]['lastPrice']
        n2=float(LTP.replace(',', ''))
        yield name, n2

def check_changes(urls):
    last_values = defaultdict(int)
    current_values = {}
    while True:
        current_values = dict(get_values(urls))
        for name in urls.keys():
            if current_values[name] - last_values[name]:
                yield name, current_values[name], last_values[name]
        last_values = current_values
        sleep(1)

for name, current, last in check_changes(urls_to_watch):
    # here you can just print the values, or store current value to list
    # and periodically store it to DB, etc.
    print(name, current, last, current - last)

Печать:

INFOSYS 750.7 0 750.7
RELIANCE 1284.4 0 1284.4
RELIANCE 1284.8 1284.4 0.3999999999998636
INFOSYS 749.8 750.7 -0.900000000000091
RELIANCE 1285.4 1284.8 0.6000000000001364

...and waits infinitely for any change to occur, then prints it.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...