根据输入数量从类实例列表中随机抽取指定元素
问题与解决方案
需求
根据用户输入的数字,从已创建的类实例中随机抽取对应数量的元素,并打印这些实例的属性。例如输入2就抽2个,输入4就抽4个(需注意实例总数不能小于输入数字)。
现有代码问题
你当前的代码存在几个关键问题:
- 类的
__init__方法直接硬编码属性值,忽略传入参数,导致所有实例属性固定不变 - 变量命名混乱(如
x2=list = []这类错误赋值) - 未正确实现“抽取指定数量随机实例”的逻辑,导致重复打印整个列表
你的类定义代码
import random class plane: def __init__(self, dyr, dyrefamilie, antallbein): self.dyr = 'Hund' self.dyrefamilie = 'Hundefamilien' self.antallbein = '4' def __str__(self): return f'undulat(={self.dyr},{self.dyrefamilie},{self.antallbein})' plane2 = plane(dyr='something', dyrefamilie="something", antallbein='4') class rocket: def __init__(self, dyr, dyrefamilie, antallbein): self.dyr = 'something' self.dyrefamilie = 'something2' self.antallbein = '4' def __str__(self): return f'katt(={self.dyr},{self.dyrefamilie},{self.antallbein})' rocket2 = rocket(dyr='something', dyrefamilie="something", antallbein='4') class boat: def __init__(self, dyr, dyrefamilie, antallbein): self.dyr = 'something' self.dyrefamilie = 'something2' self.antallbein = '5' def __str__(self): return f'undulat(={self.dyr},{self.dyrefamilie},{self.antallbein})' boat2 = boat(dyr='something', dyrefamilie="something", antallbein='2')
你尝试的代码
x2=list = [] x1=list = [] # appending instances to list list.append(plane(1,2,3)) list.append(rocket(1,2,3)) list.append(boat(1,2,3)) random.shuffle(x1) #roterer litt rundt på listen for i, x1 in enumerate(x1): #kode fra canvas print('Dyret er en', x1.dyr,'med',x1.antallbein+'-bein'+'.','denne er er en del av', x1.dyrefamilie)
修正后的解决方案
步骤1:修正类的初始化逻辑
先让类的__init__方法使用传入参数,确保每个实例可以拥有不同属性:
import random # 遵循PEP8命名规范(大驼峰),同时修正初始化逻辑 class Plane: def __init__(self, dyr, dyrefamilie, antallbein): self.dyr = dyr self.dyrefamilie = dyrefamilie self.antallbein = antallbein def __str__(self): return f'undulat(={self.dyr},{self.dyrefamilie},{self.antallbein})' class Rocket: def __init__(self, dyr, dyrefamilie, antallbein): self.dyr = dyr self.dyrefamilie = dyrefamilie self.antallbein = antallbein def __str__(self): return f'katt(={self.dyr},{self.dyrefamilie},{self.antallbein})' class Boat: def __init__(self, dyr, dyrefamilie, antallbein): self.dyr = dyr self.dyrefamilie = dyrefamilie self.antallbein = antallbein def __str__(self): return f'undulat(={self.dyr},{self.dyrefamilie},{self.antallbein})' # 创建实例 plane2 = Plane(dyr='Hund', dyrefamilie="Hundefamilien", antallbein='4') rocket2 = Rocket(dyr='Katt', dyrefamilie="Kattfamilien", antallbein='4') boat2 = Boat(dyr='Undulat', dyrefamilie="Undulatfamilien", antallbein='2')
步骤2:实现随机抽取逻辑
直接收集已创建的实例,用random.sample()抽取指定数量的不重复实例(若允许重复抽取,替换为random.choices()):
# 收集所有已创建的实例 all_instances = [plane2, rocket2, boat2] # 获取并验证用户输入 while True: try: count = int(input("请输入要抽取的实例数量:")) if 0 < count <= len(all_instances): break else: print(f"请输入1到{len(all_instances)}之间的数字") except ValueError: print("请输入有效的整数") # 随机抽取指定数量的实例 selected_instances = random.sample(all_instances, count) # 打印选中实例的属性 for idx, instance in enumerate(selected_instances, 1): print(f"第{idx}个实例:") print(f'Dyret er en {instance.dyr} med {instance.antallbein}-bein. Denne er en del av {instance.dyrefamilie}')
核心说明
random.sample(list, k):从列表中随机抽取k个不重复元素,完全匹配需求- 输入验证确保用户输入合法,避免超出实例总数的无效请求
- 直接复用已创建的实例,无需重复初始化,减少冗余操作
内容的提问来源于stack exchange,提问作者Andreas w
相关产品推荐
相关产品推荐

