Skrivet av M89:
Om du har frågor gällande python kod så posta här så hjälper jag gärna dig lösa diverse problem.
W3Schools är annars schyst och enkelt.
En bra start är t.ex modifiera redan skriven kod, Kodi har ett stort community med mycket python kod bl.a.
Hej, hittade denna tråd då jag har kört fast och du erbjöd iaf. TS hjälp, om du eller någon annan kan hjälpa mig så är jag tacksam.
Jag är själv helt 0 på programmering och har fått hjälp att skriva denna kod, märkligt nog så får författaren den att fungera på Mac, Linux och Win 11, men jag får inte till det på win 10 eller win 11 och vi kommer ingenstans med vad som kan vara fel.
Om någon kan hjälpa mig då jag antar att felet är hos mig då han får till det men inte jag, jag har python, anaconda och kör det i spyder.
När det körs ange följande input:
Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff 3
Önskad summa (t.ex. 200.0) ? 200
Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? 0.01
Tryck 1 för text-fil och 2 för CSV-fil: 1
Kod:
[import requests
import re
import json
import itertools
import os
import time
from concurrent.futures import ProcessPoolExecutor
def process_chunk(start, end, rowlist, pmin, pmax):
try:
sub_gen = itertools.islice(itertools.product(*[enumerate(row) for row in rowlist]), start, end)
except:
print(f"Itertools failed at {start} - {end}")
quit()
valid_combinations = []
tss = 0
for comb in sub_gen:
tss += 1
try:
indices, values = zip(*comb)
except:
print("zip failed, with comb of:",len(comb))
quit()
s = sum(values)
if pmin <= s <= pmax:
valid_combinations.append(indices + (s,))
return valid_combinations, tss
def main():
max_num_of_workers = 8 # ändras för att ändra antalet parallella processer
gamemode = int(input("Spelform? 1= Stryktipset 2= Europatipset 3= Fullträff "))
if not gamemode in [1,2,3]:
print("Endast 1-2 möjliga val. Avbryter.")
quit()
pgoal = float(input("Önskad summa (t.ex. 200.0) ? "))
pdev = float(input("Tolerabel +/- avvikelse decimaltal (t.ex. 0.05)? "))
pmin = pgoal - pdev
pmax = pgoal + pdev
mde = int(input("Tryck 1 för text-fil och 2 för CSV-fil: "))
if not mde in [1,2]:
print("Endast 1 eller 2 möjliga val. Avbryter.")
quit()
urls = ["", "https://spela.svenskaspel.se/stryktipset" , "https://spela.svenskaspel.se/europatipset", "https://spela.svenskaspel.se/fulltraff"]
url = urls[gamemode]
outfiles = ["", "tips.txt", "tips.csv"]
outfile = outfiles[mde]
try:
response = requests.get(url)
html_content = response.text
except:
print(f"Kan inte komma hämta data från: {url}. Avbryter.")
quit()
pattern = r'_svs\.tipsen\.data\.preloadedState\s*=\s*(\{.*\});'
try:
match = re.search(pattern, html_content)
json_str = match.group(1)
json_obj = json.loads(json_str)
gameDict = json_obj["EventTypeStatistic"]
gameKeys = list(dict.keys(gameDict))
except:
print(f"Kunde inte extrahera data")
quit()
signlists = []
rowlist = []
if gamemode == 3: # om fullträff, sätt upp lista utifrån 13 rader
draws=json_obj["Draws"]["entities"]
try:
drawsKey = list(dict.keys(draws))[0]
except IndexError:
print("Inte möjligt att hämta Fullträff-omgång. Avbryter.")
quit()
omg=draws[drawsKey]["drawNumber"] # hämta omgångsnr
print(f"Fullträff omgång {omg}:")
else: # annars sätt upp lista utifrån 3 tecken
for _ in range(0,3):
signlists.append([])
for gameKey in gameKeys: # iterera över alla 13 matcher
numAlts=3
if gamemode==3: # Fullträff
numAlts=6
game = gameDict[gameKey]["odds"]["current"]["value"] # hämtar odds-värden från Fullträff-sidan
gamesum = 0.0
floats = []
fgame = []
for i in range(0,numAlts):
if game[i] == None:
print ("None-error",gameDict[gameKey])
quit()
f = 100.0/float(game[i]) # konvertera oddset 100/o
floats.append(f)
gamesum = sum(floats)
for ix,o in enumerate(floats):
newo = 100.0 * o / gamesum # normalfördela fullträff-oddsen så att summan blir 100.0
if ix<numAlts:
fgame.append(newo)
if gamemode==3:
rowlist.append(fgame)
else:
for ix,perc in enumerate(fgame):
signlists[ix].append(perc)
if gamemode<3:
P = { "1": signlists[0], "X": signlists[1], "2": signlists[2] }
rows = itertools.product(*(['1X2'] * 13))
cn = 0
with open(outfile, 'w') as f:
for row in rows:
percentage = sum(P[result][n] for (n, result) in enumerate(row))
if pmin <= percentage <= pmax:
cn += 1
if mde==1:
f.write("E,"+','.join(row)+"\n")
if mde==2:
f.write(','.join(row + (str(percentage),))+"\n")
else:
maxcoupons = 10000
cn = 0
tsts = 0
valid_combinations = []
default_workers = os.cpu_count()
print(f"Default number of workers: {default_workers}")
chunk_size = 500000 # You can adjust the chunk size
total_size = 6 ** 13 # 6^13 combinations
chunks = [(i, min(i + chunk_size, total_size)) for i in range(0, total_size, chunk_size)]
print ("Length of chunks:",len(chunks))
start_time = time.time()
with ProcessPoolExecutor(max_workers=max_num_of_workers) as executor:
print(f"Executor is using {executor._max_workers} workers")
for chunk_result, chunk_tsts in executor.map(process_chunk, [start for start, end in chunks], [end for start, end in chunks], itertools.repeat(rowlist), itertools.repeat(pmin), itertools.repeat(pmax)):
tsts += chunk_tsts
valid_combinations.extend(chunk_result)
cn += len(chunk_result)
if tsts % 1000000 == 0:
print(int(tsts / 1000000), "million iterations,", cn, "rows found")
if cn >= maxcoupons:
break
end_time = time.time()
taken_time = round(end_time - start_time,2)
ave_time = round(taken_time/(tsts/1000000),4)
print(f"Time taken: {taken_time} seconds")
print(f"Avg. time: {ave_time} sec/million iterations")
with open(outfile, 'w') as f:
f.write(f"Fulltraff,Omg={omg}\n") # första raden
for ix,comb in enumerate(valid_combinations):
if mde == 1 and ix<maxcoupons: # TXT-läge
comb=list(comb)
comb.pop() # ta bort summa som inte används i TXT-läge
f.write("E,"+','.join(str(nm) for nm in comb)+"\n")
elif mde == 2 and ix<maxcoupons: # CSV-läge
f.write(','.join(str(nm) for nm in comb)+"\n")
cn=min(cn,maxcoupons)
print(f"{outfile} skapad med {cn} rader!")
if __name__ == '__main__':
main()]