【问题标题】:how can i randomly print an element from a list in python如何从 python 的列表中随机打印一个元素
【发布时间】:2010-05-04 02:00:58
【问题描述】:

到目前为止,我有这个,它打印出我列表中的每个单词,但我试图随机打印一个单词。有什么建议吗?

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()

【问题讨论】:

    标签: python file random


    【解决方案1】:

    试试:

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

    请注意,这会在选择随机行之前从 每一行 中删除'\n';一个更好的解决方案留给读者练习。

    【讨论】:

    • @Greg, random.choice not 是否接受生成器参数(它需要一个支持 len 的参数)。如果确实如此(或者如果您使用 listcomp 而不是 genexp),您的代码将打印一个随机 line,而不是从每行打印一个随机 word,正如 OP 所要求的那样为。
    • @Alex:非常正确,谢谢,更正了生成器的使用。我将这个问题解释为要求从每行一个单词的单词列表中选择一个随机单词。
    • 在没有将文件分配给变量的情况下,切勿打开文件,否则您将无法关闭它。
    • @None:这取决于您对 Python 引用计数行为的信心,当最后一个引用消失时,文件将被关闭。当然,这不一定适用于 Python 的所有实现。
    • @Greg,您对问题的解释是正确的!
    【解决方案2】:

    要每行打印一个随机单词,您的循环可以是:

    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)
    

    您的计数部分似乎是正确的,但与您的问题无关。

    编辑:我看到您在 Q 中的意思有所不同(正如其他 A 的解释一样):您想从文件中选择一个随机的 line,而不是随机的每一行的单词。在这种情况下,其他 A 是正确的,但它们将 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】:
    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 太大,那么我想你会开始遇到内存问题,但我认为这在大多数情况下应该没问题

    希望这会有所帮助。

    【讨论】:

    • 这是有道理的。不过,我不明白为什么你必须使用 len()
    • @inspectorG4dget:Python 提供了方便的函数,例如random.choice(),可以让这个解决方案变得更简单。
    • @Greg,我一直在尝试使用 random.choice,但没有奏效。你建议我在我的小程序中改变什么?
    • @lm:您是否尝试过我在回答您的问题时提供的解决方案?
    • @lm, len(list) 告诉你“list”的长度。 random.randint(a, b) 返回 a 和 b 之间的随机整数,因此是 len(words)-1。您应该查看 random.randint 上的帮助。在 Python 解释器上输入以下内容: import random;帮助(random.randint)
    猜你喜欢
    • 2013-07-26
    • 2023-03-03
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多