There are 4 states of knowledge.
We don't know something
We do know something
We know there is something we don't know
We don't know what it is we don't know
As far as algorithms or patterns and so forth, it could be that you have some "don't know what I don't know" going on. Something is missing, you don't know what it is, but you know you don't know it. It's very mysterious!
I don't think I'll be much help here, I can't point you to any resources and Python is not my language. I just wanted to say that you sound like you know that you don't know something, but you don't know what you don't know, you think it might be algorithms. Maybe, maybe not!
I would only say, go ahead and do some Googling on algorithms then, but DON'T spend much time trying to learn any of it. What you want is a very high-level view of gathering intel on more programming "stuff" that you currently don't know about.
It's like when I got started, I used relational databases. I never knew there were non-relational databases until the concept fell from the sky and hit me. I didn't know what I didn't know. But had I spent any time browsing any kind of database information at all, I would have come across the concept sooner and at least knew the thing existed as a solution.
So go find some lists of algorithms, just don't study them much. Get a high-level view of "this thing is possible". Now you "know" something which you will still "not know" how to do. And should you ever get in a situation where that algorithm might be needed, somewhere in the back of your head you'll remember "oh yeah, there was some concept I read about once that solves this". Of course you don't "know" the solution, but at least you "know what you don't know" and can go research it again because now you know it exists.
A lot of programming boils right down to basic math operations, string operations, comparisons, editing data in objects and arrays, sending/receiving data, sorting, looping, counting.
Any time you come across a problem, try to break it down into the component parts. What data is incoming that I have to work with? What data needs to be output for the solution? What kind of conversion needs to take place between incoming data, to get output data? What data types are involved? Strings, integers, floats, random numbers? Does some data need to be generated within the logic itself in order to get the output? Do you have to retrieve additional data from another system/function/process/library to complete the challenge?
Functions can be getters or setters. Data can be BREAD (Browse, Read, Edit, Add, Delete). Or with databases, CRUD (Create, Read, Update, Delete). Typically you are doing one of those operations at a time.
Programs can function asynchronous or synchronous. Must one operation finish before another can continue? If so, it is "blocking". Or can multiple operations happen at once, as soon as they can, and run in any order? There are methods of dealing with it.
How about data storage? What storage techniques are there? How do you maintain state? Do you need to store data to complete the challenge?
There are hooks and injectors, generators. How do multiple pieces of code/functions/classes/objects call each other? What is the scope you're in? Are there dependencies?
Every different programming concept deserves a bit of a look at the overall picture. Don't study it, just skim it. Then somewhere in the back of your head you'll remember "oh, there is a technique for that, I just don't know it, but I know it's there." And then you can go study it for realsies.