Benature/WordReview

list最後一個單詞點擊下一步之後 ,出現 '你怕是还没背过这个List'

Closed this issue · 19 comments

views.py

if rate == 0:
status = 404
msg = '你怕是还没背过这个List'
continue

似乎是計算準確率。但是理論上應該不會是零啊

可能需要看下你数据库中那个 List 的 rate 的值来看下什么情况?

rate = sum([r[0] if r[0] != -1 else 1 for r in ld.values_list('rate')
]) / L_db.word_num
rate = 1 - rate if rate != 0.0 else 0

rate = models.FloatField(
'单词遗忘率', default=-1, null=False)

这个应该是只要有一个单词被标记rate之后,rate的判断就不会为0吧。这个是review里面的数据,前100个不会出现这个问题,到第二个list就出现这个报错
1-200.txt

这个应该是只要有一个单词被标记rate之后,rate的判断就不会为0吧。

是的。那应该是第二个list的rate都是0,都还没背过?(没有一个单词点过「我记得」/「不认识」)

如果上述猜测不对,你可以考虑只select出第二个list的的单词来看看,或者不介意的话把sqlite3文件发给我看看?

感谢兄弟回复那么快,我上面的附件里面有review的text文件,筛选了0-200两个list的单词,如果需要完整的db文件再和我说,我从mysql里面导出来

到第二个list就出现这个报错

我看下,"第二个list" 指的是 LIST==1 的对吧

是的

我大概知道了,你应该是因为整个list都做了简单标记

试试把 view.py 中 rate 的计算换成下面的代码。如果没问题我就更新下代码

        # 背过的单词进度
        rate = (len([r[0] for r in ld.values_list('rate') if r[0] != -1]) +
                len(ld_pass)) / L_db.word_num
        rate = 1 - rate if rate != 0.0 else 0

rate = sum([r[0] if r[0] != -1 else 1 for r in ld.values_list('rate')
]) / L_db.word_num
rate = 1 - rate if rate != 0.0 else 0

点错了不好意思...

image
似乎还是不行。。

print下这几个看看什么情况

print(len(ld), len(ld_pass), rate)

最初的代码应该是没有问题的,当我改成第二版的时候第一个list也出现了问题。
初始代码:
list0: 2 98 0.013334
list1: 0 100 0.0

新代码:
list0: 0 100 0.0
list1: 0 100 0.0

哦... 试试换成这样

        # 背过的单词进度
        rate = (len([r[0] for r in ld.values_list('rate') if r[0] != -1]) +
                len(ld_pass)) / L_db.word_num
        print(len(ld), len(ld_pass), rate)
        if rate == 0:
            status = 404
            msg = '你好像还没背过这个 List 诶 😳'
            continue
        rate = 1 - rate if rate != 0.0 else 0

Hi bro, 问题在于 ld.values_list('rate') 这个set是空的,所以rate值总是空的 ld = Review.objects.filter(
BOOK=BOOK, LIST=LIST, flag__lt=1) 这里面的参数 flag__lt=1 是什么意思呢,我看到LIST的输出是1应该没问题,book因为第一个list没问题,应该也ok

看命名规则似乎是less than的意思,逻辑也没问题,但是如果去掉这条filter问题就全部消失了。

lt 是 less than 的意思,查询的是flag小于1的值。flag是单词是否简单的标记。你的list应该是全部都标记简单了,所以 ld 是空的,但这样 ld_pass 肯定是不空的,所以我才改了 rate 的赋值。

哦... 试试换成这样

        # 背过的单词进度
        rate = (len([r[0] for r in ld.values_list('rate') if r[0] != -1]) +
                len(ld_pass)) / L_db.word_num
        print(len(ld), len(ld_pass), rate)
        if rate == 0:
            status = 404
            msg = '你好像还没背过这个 List 诶 😳'
            continue
        rate = 1 - rate if rate != 0.0 else 0

你试过这个没有呢

我懂了,可能是我第一遍把看过的单词都标记为掌握来区分是否看过(绿色圆点)?那么我考虑下次把不认识的标为重难。
新的也试过了,但是continue后面是不是就直接跳出循环了。

if rate == 0 and len(ld) > 0:

我 if 多个判断吧,之前没碰到过整个 list 都打简答标签的情况。如果我没记错的话,这个 rate 是看还不熟悉的单词的比重(年代太久远了),所以才要在查询的时候区分flag来取数。

continue就不对这个list作后续处理了,所以要是把if判断条件补充一下逻辑应该就对了。

本身continue跳出是防止在list中一直「下一个」直接把整个list「下一个」完了的情况。

帅,解决了。