如何在Python中随机打印列表中的元素
到目前为止,我有这个代码,它会把我列表里的每个单词都打印出来,但我想只随机打印一个单词。有没有什么建议?
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太大了,我觉得你可能会遇到内存问题。不过对于大多数情况来说,这个方法应该是没问题的。
希望这对你有帮助。