因此,我正在尝试开发一个可以帮助人们学习新语言的程序,但是我一直处于起步阶段。要求之一是让Python以随机顺序打印行。所以我做到了。
import random
def randomline(file):
with open(file) as f:
lines=f.readlines()
print(random.choice(lines))
但是现在我遇到了其他要求之一的问题。之间必须有另外四个单词才能再次显示该单词,我不知道该怎么做。
答案 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)
输出如下:(仅显示部分结果)
[]
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
次之后进行。这会解决的。但是,这极有可能陷入无限循环。
另一种方法是创建一个包含所有索引(即行号)的列表,将其随机排列,然后遍历它们。这样做的好处是不会冒无限循环的危险,但这也意味着您需要先遍历其他所有行,然后才能再次看到同一行,这可能对您而言并不理想。