如何在Python中随机打印列表中的元素

0 投票
3 回答
1074 浏览
提问于 2025-04-15 22:19

到目前为止,我有这个代码,它会把我列表里的每个单词都打印出来,但我想只随机打印一个单词。有没有什么建议?

def main():
    # open a file
    wordsf = open('words.txt', 'r')
    word=random.choice('wordsf')
    words_count=0
    for line in wordsf:
        word= line.rstrip('\n')
        print(word)
        words_count+=1      

    # close the file
    wordsf.close()

3 个回答

1

要每行打印一个随机单词,你的循环可以这样写:

for line in wordsf:
    word = random.choice(line.split())
    print(word)

如果有些行只是空白,你也需要跳过这些行:

for line in wordsf:
    if line.isspace(): continue
    word = random.choice(line.split())
    print(word)

你提到的计数部分看起来是对的,但和你的问题没有关系。

编辑:我看到你在问题中想表达的意思和其他回答者理解的不同:你是想从文件中随机选择一整行,而不是从每一行中随机选择一个单词。这样的话,其他回答是对的,但它们需要使用O(N)的额外内存来处理一个有N行的文件。Knuth有一个很好的算法,可以从一个不知道有多少项的流中随机选择样本(不幸的是,它需要生成N个随机数,所以如果你有足够的内存,这个方法会比简单的方法慢……但考虑一下还是很有趣的!):

n = 0
word = None
for line in wordsf:
    n += 1
    if random.randrange(n) == 0:
        word = line
print(word.strip())

基本上,在每一行n时,我们以1.0/n的概率选择它来替换之前的行(如果有的话)——第一次的概率是1(确定),第二次的概率是0.5,依此类推。我只在最后进行去空格处理,因为提前去掉临时选择的空格是浪费精力;而且我通过生成一个在0到n-1之间均匀分布的随机数来避免除法和浮点数的问题(所以这个随机数为0的概率是1/n)——这些都是小问题,但既然不会让代码变得不清晰,我们就顺便处理一下吧;-)

3

试试这个:

print random.choice([x.rstrip() for x in open("words.txt")])

注意,这个方法会把每一行的 '\n' 去掉,然后再随机选择一行;更好的解决方案留给读者自己去思考。

0
import random
def main():
    wordsf = open('words.txt', 'r')
    words = [line.rstrip('\n') for line in wordsf]
    wordsf.close()

    random_number = random.randint(0, len(words)-1)
    random_word = words[random_number]
    print random_word

这个方法很好用,但如果文件wordsf太大了,我觉得你可能会遇到内存问题。不过对于大多数情况来说,这个方法应该是没问题的。

希望这对你有帮助。

撰写回答