我遇到的问题是,我需要将字母a-z设置为从1到26的随机唯一值。我要避免使用等于多个字母的相同数字。我目前使用的方法超过70行,并且每个字母的while循环不等于先前为其他字母指定的值。有任何想法吗?
使用random.sample()
,它可以从给定间隔中获取任意数量的唯一元素。如果您使用整个可迭代对象,那么您将以有效的随机顺序获得元素。例如,以下代码段将字母表中的字母映射到1
至26
的随机数,而无需重复任何代码。
import random
alphabet = 'abcdefghijklmnopqrstuvwxyz'
numbers = range(1, len(alphabet) + 1)
correspondence = list(zip(alphabet, random.sample(numbers, len(alphabet))))
print(correspondence)
# [('a', 21), ('b', 19), ('c', 2), ('d', 14), ('e', 12), ('f', 3),
# ('g', 8), ('h', 11), ('i', 10), ('j', 4), ('k', 5), ('l', 22),
# ('m', 18), ('n', 20), ('o', 16), ('p', 23), ('q', 1), ('r', 25),
# ('s', 9), ('t', 15), ('u', 26), ('v', 7), ('w', 17), ('x', 24),
# ('y', 6), ('z', 13)]
您可以使用random.shuffle()
(docs)和chr()
(docs)获得所需的输出。
[ASCII小写字母字符从97开始。
import random
numbers = list(range(1,27))
random.shuffle(numbers)
for num in numbers:
print(f'Letter={chr(96+num)}, Random Number={num}')
输出:
Letter=v, Random Number=22
Letter=t, Random Number=20
Letter=u, Random Number=21
Letter=w, Random Number=23
Letter=f, Random Number=6
Letter=b, Random Number=2
Letter=d, Random Number=4
Letter=h, Random Number=8
Letter=z, Random Number=26
.
.
.
.
您也可以使用random.sample()
。更多信息here。
一个班轮:
result = [(chr(96+num), num) for num in random.sample(list(range(1,27)), 26)]
输出:
[('p', 16), ('x', 24), ('d', 4), ('f', 6), ('w', 23), ('z', 26), ('m', 13), ('n', 14), ('b', 2), ('a', 1), ('s', 19), ('q', 17), ('t', 20), ('u', 21), ('h', 8), ('l', 12), ('e', 5), ('k', 11), ('g', 7), ('c', 3), ('v', 22), ('r', 18), ('j', 10), ('i', 9), ('o', 15), ('y', 25)]