freezard__ 2022-02-08 17:48 采纳率: 50%
浏览 34
已结题

想要写一个不放回抽取排序,同时想要用yield减少内存,但是有些问题

问题遇到的现象和发生背景

我想要写一个用来抽取的代码工具(python),读取文件,写入文件等功能
我的计划是写好了CSV之后用python写入和输出,并且代码编写过程中遇到了随机排序的需求,但是我想要减少内存,最简单的方法当然是yield

问题相关代码,请勿粘贴截图

代码如下:
1:

def check(iterable):
    for e in iterable:
        q = choice(iterable)
        iterable.remove(q)
        yield q
        print (iterable)
        iterable.remove(q)
#这串代码由于本人阅历的原因看上去好像没什么问题,但他的抽取是放回式的,这与我的设计不符。所以这里有一处问题

以上只是一个辅助的函数,而正式函数在编写到刚开始时调试时就发现了问题
2:

def r(PL_num):
    PL_num = int(PL_num)
    if PL_num < 2:
        return False
    elif PL_num == 2:
        for __Count in range(2):
            print(next(check([1,2])))           

运行之后出现了:
1
1

2
2
的情况。很明显不是不放回抽取,但是我认为list.remove应该是没问题的,而调试却发现了其他问题:
3:

s = 1
iterable = [1,2,3]
for e in iterable:
    q = choice(iterable)
    iterable.remove(q)
    print(s,":")
    print(q)
    print (iterable)
    s += 1
#输出是
"""
1 :
2
[1, 3]
2 :
3
[1]
"""

#当调整循环次数为10时,输出为:
1 :
2
[1, 3, 4, 5, 6, 7, 8, 9, 10]
2 :
3
[1, 4, 5, 6, 7, 8, 9, 10]
3 :
10
[1, 4, 5, 6, 7, 8, 9]
4 :
8
[1, 4, 5, 6, 7, 9]
5 :
9
[1, 4, 5, 6, 7]

问题3目前找到了替代方案(虽然原方案的原因未知)因而我继续编写

#对原代码进行如下修改:
def check(iterable):
    for e in range(len(iterable)):
        q = choice(iterable)
        iterable.remove(q)
        yield q
        print (iterable)
        iterable.remove(q)
#但是仍然会出现重复的情况
运行结果及报错内容

在上一版块中已经写明

我的解答思路和尝试过的方法
#好消息是问题三我已经得到了解决,只需要稍微改动就可实现
s = 1
iterable = [1,2,3,4,5,6,7,8,9,10]
for e in range(len(iterable)):
    q = choice(iterable)
    iterable.remove(q)
    print(s,":")
    print(q)
    print (iterable)
    s += 1
#此时输出就会出现循环正确次数而不是(正确)//2,但是之前的代码的 错误原因还需要讲解

我想要达到的结果

实现不放回抽取(使用yield),因为待读取文件较大导致用return比较占内存

  • 写回答

2条回答 默认 最新

  • 老师我作业忘带了 2022年度博客之星人工智能领域TOP 2 2022-02-08 20:30
    关注

    问题三太长了我不看了。至于问题1,2,当你传入2,你执行了两次check([1, 2]),第一次确实删了一个(猜测你的choice函数来自random),第二次执行你又传进去个列表:check([1, 2]),这是新的完整的[1,2]不是吗,又因为是随机的,所以你的输出结果每次也不一样。 建议:实例化一个生成器对象,对对象进行for循环,简单便捷又美观,还能解决stopinteration报错的问题。如果帮到您请给予回复,谢谢。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月21日
  • 已采纳回答 2月13日
  • 创建了问题 2月8日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?