[1, 2, 3] key2 -> [1, 2, 3, ... 17] key3 -> [1, 2, 3, 4, 5] 我想选择一个-6ren">
gpt4 book ai didi

python - 从 "non uniform"python 字典中选择随机元素

转载 作者:太空宇宙 更新时间:2023-11-03 11:25:33 25 4
gpt4 key购买 nike

我有一个 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

我的问题是:有更好/更快的方法吗?

最佳答案

您可以尝试(在 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

我使用像 {'key2': [3, 4, 5], 'key1': [0, 1, 2]} 这样的小 D 来检查分布和分布看起来对我来说很好:

0,166851
1,166141
2,166269
3,167094
4,167130
5,166515

关于python - 从 "non uniform"python 字典中选择随机元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34703936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com