从Python文件中读取随机行,直到其他4行通过,该行才会重复

时间:2019-11-29 11:43:43

标签: python python-3.x

因此,我正在尝试开发一个可以帮助人们学习新语言的程序,但是我一直处于起步阶段。要求之一是让Python以随机顺序打印行。所以我做到了。

import random

def randomline(file):
    with open(file) as f:
        lines=f.readlines()
        print(random.choice(lines))

但是现在我遇到了其他要求之一的问题。之间必须有另外四个单词才能再次显示该单词,我不知道该怎么做。

4 个答案:

答案 0 :(得分:2)

我为您提供了一个非常原始的解决方案:

import random 

def randomline(file):
    with open(file) as f:
        lines=f.readlines()
        return random.choice(lines)

isOccuredInLastFourExistence = True
LastFourWords = []

file = "text_file.txt"
for i in range(0,15):
    new_word = randomline(file)
    print(LastFourWords)
    if new_word in LastFourWords:
        print("I have skipped")
        print(new_word)
        continue
    print(new_word)
    LastFourWords.append(new_word)
    if(len(LastFourWords)) > 4:
        LastFourWords.pop(0)

文件如下所示:
enter image description here


输出如下:(仅显示部分结果)

[]
New

['New\n']
Example

['New\n', 'Example\n']
After

['New\n', 'Example\n', 'After\n']
Some

['New\n', 'Example\n', 'After\n', 'Some\n']
I have skipped
Example

['New\n', 'Example\n', 'After\n', 'Some\n']
Please

['Example\n', 'After\n', 'Some\n', 'Please\n']
I have skipped
Please

['Example\n', 'After\n', 'Some\n', 'Please\n']
Only

['After\n', 'Some\n', 'Please\n', 'Only\n']
Word
['Some\n', 'Please\n', 'Only\n', 'Word']
New

因此,每当列表中已有某项内容时,就会被跳过。并且当元素超过4个时,列表将清除第一个位置元素。

答案 1 :(得分:1)

您可以使用队列:

# create list with empty elements against which choice is checked
queue = 4*['']

def randomline(file):
    with open(file) as f:
        lines=f.readlines()
        choice = random.choice(lines)
        if not choice in queue:
            print(choice)

            # appendcurrent word to the queue
            queue.append(choice)
            # remove the first element of the list
            queue.pop(0)

答案 2 :(得分:1)

您可以使用deque库中的collections。这将允许您为可见单词列表指定最大长度。在将项目追加到列表时,如果列表的长度最大,并且追加了新项目,则最早的项目将被删除。这使您可以进行缓存。因此,如果您使用最大长度为4的deque创建一个列表,则选择一个单词并检查它是否在列表中;如果它随后选择了另一个单词,如果它不在列表中,则打印该单词并添加它到列表。您不必担心管理列表中的项目,因为当您添加新内容时,最旧的项目将自动退出

from collections import deque
from random import choice, sample

with open('test.dat') as words_file:
    words = words_file.readlines()
    word_cache = deque(maxlen=4)
    for _ in range(30):
        word = choice(words).strip()
        while word in word_cache:
            word = choice(words).strip()
        print(word)
        word_cache.append(word)

答案 3 :(得分:-1)

我会使用linecache。它来自标准库,允许您选择特定的行。如果您知道文件中的行数,则可以这样做:

import linecache
import random

def random_lines(filename, repeat_after=4):

    n_lines = len(open(filename, "r").readlines())
    last_indices = []

    while True:

        index = random.randint(1, n_lines)

        if index not in last_indices:

            last_indices.append(index)
            last_indices = last_indices[-repeat_after:]

            line = linecache.getline(filename, index)
            yield line

这将创建一个生成器,该生成器将从文件中输出一条随机行,而无需将行保留在内存中(如果您开始有很多行,那会很棒)。

关于您的要求仅允许重复n次之后进行。这会解决的。但是,这极有可能陷入无限循环。

另一种方法是创建一个包含所有索引(即行号)的列表,将其随机排列,然后遍历它们。这样做的好处是不会冒无限循环的危险,但这也意味着您需要先遍历其他所有行,然后才能再次看到同一行,这可能对您而言并不理想。