Get the size of a list?

D4r4dragon
07 Feb 2021, 00:05

I'm sure this has most likely already been asked, but mobile is being dumb so I can't search, and I'm not going to scour pages of lists of posts for it.
But...
How do I retrieve the size of a list or dictionary so I can randomly choose one in a list/dct that has a changing set of values? And is there a way to get the location of a dctnry? Or do I need a list with the location's names?


mrangel
07 Feb 2021, 01:19

(Edit: changed ListCpunt to ListCount in the example code… damn typos)

You can use the function ListCount to get the number of items in a list. Contrary to what the documentation says, it seems to work for dictionaries as well.

In the case of lists, you can use the core functions PickOneString and PickOneObject, which take a single argument (a list) and return a random item from that list. They will generate an error if the returned item isn't the required type.

To get a random item from a dictionary, you would probably want something like:

count  = GetRandomInt (1, ListCount (dict))
foreach (item, dict) {
  count = count - 1
  if (count = 0) {
    key = item
    value = DictionaryItem (dict, item)
  }
}
msg ("The randomly selected item is key: " + key + ", value: " + value)

(if you were using this in a function, you could use return to end as soon as you find the item you want)

Alternatively, you could keep a separate list of the keys, which is what some of the core functions do, but if the dictionary is modified often this is likely to be less efficient.


D4r4dragon
07 Feb 2021, 01:35

Ooh, thanks a ton for this, very helpful! But yes, I am working on a random dungeon generator so the list will be scrambling a ton of times as rooms are generated.