You can try (in Python 3 - for Python 2, use iteritems()):
idx = random.randint(0, n)
for k, v in D.items():
if idx < len(v):
do_something_with_val(k, v[idx])
break
else:
idx -= len(v)
:
def ref():
idx = random.randint(0, n)
c = 0
found = False
for k in D:
for v in D[k]:
if c == idx:
found = True
break
c += 1
if found:
break
def uut():
idx = random.randint(0, n)
for k, v in D.items():
if idx < len(v):
break
else:
idx -= len(v)
if __name__ == '__main__':
print(timeit.timeit('ref()', setup="from __main__ import ref", number=1000))
print(timeit.timeit('uut()', setup="from __main__ import uut", number=1000))
:
1.7672173159990052
0.011254642000494641
, D {'key2': [3, 4, 5], 'key1': [0, 1, 2]}, :
0,166851
1,166141
2,166269
3,167094
4,167130
5,166515