Project idea: Side-by-side comparison module
Many decisions (important and frequent ones) come in the form of prioritization of several items (tasks, desiderata, problems, etc.). While we can do this in our head for most small decisions involving up to at most seven items, we usually resort to pen and paper for longer lists or the more important decisions.
Mathematically speaking, we impose a total order on a set.
Sometimes we get strange feelings doing this: of course A has a higher priority than B, and B has a higher priority than C - but somehow one should do C before A, so there's a circularity. Sometimes this happens without noticing. Most of the time, we inject some randomness in our decision-making to fix these problems.
Do you really need a total order? If you prioritize tasks, you might really only need to find the most important 3 tasks and then re-prioritize after that (because your constraints change anyway). Sometimes it's okay to explicitly state that 2 things have equal priority, so you don't write down any unnatural order that gives a false sense of priority where there isn't any (once it's written down ...).
How do you put a list of 3 things in total order? Well, by comparing one to the two others and then the two others to each other. How do you put a list of 20 things in total order? Maybe you compare some of them, but you certainly don't compare each item with each other - you infer that A > B and B > C implies A > C. You should just not be fooled to think that C > A is now impossible (preferences don't form a total order).
I always wish for a nice software tool (mostly a UI/UX thing) that helps with these things. Ideally, I'd give the software a (not meaningfully ordered) list of items (tasks or books I want to read or movies that I watched and want to rate, etc.). The software now presents me two items for direct comparison (remember hot-or-not?) and I choose. After having made enough comparisons, the software can do better than picking randomly - it can give me comparisons that would yield more information about the whole order. Example: I have A,B,C,D,E and compared already A>B and C>D and D>E, so we can infer a graph with two components A>B and C>D>E. Now it's not wise to ask for C<>E because that wouldn't reduce the number of connected components. It would also not be wise to ask for A<>C or B<>E since no outcome would result in a linearly ordered graph. Of course, we might end up with a circularity, in which case the software should first try to get any inferred link in the circle compared explicitly (probably with the helpful comment that there's a circle), then ask for a place to cut. Not cutting would also be okay, but the software would then just choose randomly a cutting point when you'd ask it for a totally ordered list.
Tasks are probably not the best example, as we have the urgent/nonurgent and the important/nonimportant axes. Maybe one would want to allow for more than one ordering direction, and then extracts the diagonal urgent+important -> nonurgent+nonimportant as ordered list. Something like that is definitely already happening in several task-management apps (and it should!).
The last time I tried coding this quickly I encountered the problem that Python's data structures were not aligned very well to this kind of problem. I had to write a graph class on my own and time got consumed so quickly that I stopped (please don't ask for anything specific, I don't remember). Also, the UX component is crucial: you want minimal interference from the tool, it should only help you. So I think the next time I tackle this I want to think about UX first.
See also my other project ideas.