我有一个python字典,其中值是整数列表:
key1 -> [1, 2, 3]
key2 -> [1, 2, 3, ... 17]
key3 -> [1, 2, 3, 4, 5]
我想选择一个随机元组(key,val),其中val是值列表中的随机值(例如:key2,8)。随机选择在所有值中必须是一致的,因此,例如,此方法不一致:
random_key = random.choice(d.keys())
random_val = random.choice(d[random_key])
因为列表的长度不同。 我知道列表串联的长度n,所以我目前的方法如下:
idx = np.random.randint(n)
c = 0
found = False
for k in D:
for v in D[k]:
if c == idx:
found = True
do_something_with_val(k, v);
break
c += 1
if found:
break
我的问题是:有更好/更快的方法吗?
答案 0 :(得分:2)
您可以尝试(在Python 3中为Python 2使用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
# do_something_with_val(k, v);
break
c += 1
if found:
break
def uut():
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)
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
答案 1 :(得分:0)
您可以构建一个帮助程序“values”容器并将其用于随机选择......
import random
d = {1: [1, 2],
2: [1, 2, 3, 4]}
values = [(k, v) for k, l in d.items() for v in l ]
k,v = random.choice(values)
print (k, v)
这种方法速度非常快但需要更多内存...... 玩得开心;)