There are many approaches. It would be important to know how you design your game. Are there different quality levels (normal, rare, magical ...)? Do you use a sprite with different animations for an item type or for each item an extra sprite? What about the enemies and containers?
Here I have a very simple variant for a still effective drop system. It uses no arrays or dictionaries, but many instance variables. To increase the drop chance of an item within a quality level, you can enter it several times in the list. However, I do not know if there is a limit for a string variable. At some point and for even more accuracy, an array might be needed. But then it gets far more complex and the code much longer.
1drv.ms/u/s!Ap_-qxoGKbDchALxLOyU3rOHQuJD
Edit: You should think carefully which objects you are packing into a family! It would be possible to put all enemies and containers into one family and assign them the necessary instance variables. When calling the function, you then select the correct object via the UID. It is always a pain changing everything afterwards.