Python 从列表中删除单个项目
所以我试图定义Draw(n=int),但是当我运行这段代码时,self.contents.remove(r)命令只返回1项。当我画图的时候,我需要把球从桶里拿出来,这样我就不会得到同样的球两次了Python 从列表中删除单个项目,python,list,Python,List,所以我试图定义Draw(n=int),但是当我运行这段代码时,self.contents.remove(r)命令只返回1项。当我画图的时候,我需要把球从桶里拿出来,这样我就不会得到同样的球两次了 class Bucket: def __init__(self, **kwargs): self.contents = [] for k,v in kwargs.items(): for n in range(v):
class Bucket:
def __init__(self, **kwargs):
self.contents = []
for k,v in kwargs.items():
for n in range(v):
self.contents.append(k)
def draw(self, n):
x = []
for ball in range(n):
r = random.choice(self.contents)
x.append(r)
self.contents.remove(r)
if n > len(self.contents):
return self.contents
else: return x
h1 = Hat(red=3,blue=2)
print(h1.contents)
print(h1.draw(4))
输出为:
['red', 'red', 'red', 'blue', 'blue']
['blue'] ---> this supposed to have 4 items.
这里怎么了?从列表中删除项目的方法就是
list.remove(item)
。我不知道你为什么要把它放在一个循环中
==看到@barmar的评论后编辑
所以你要么想要
while item in list:
list.remove(item)
或
您可以尝试以下方法:
balls = ["blue", "blue", "blue", "red", "red"]
new = []
for ball in range(len(balls)):
r = random.choice(balls)
new.append(r)
balls.remove(r)
问题在于最后的
if
测试。如果从self.contents
中删除至少一半的项,则n>len(self.contents)
将为true,并且您将返回self.contents
而不是x
如果您试图防止错误尝试绘制的球数超过self.contents
中的球数,则If
条件应位于函数的开头,而不是结尾
def draw(self, n):
if n > len(self.contents):
x = self.contents
self.contents = []
else:
x = []
for ball in range(n):
r = random.choice(self.contents)
x.append(r)
self.contents.remove(r)
return x
list.remove(r)
只删除第一个匹配元素,而不是全部。如果列表中有r,则不需要random.choice()。您不应该使用Python关键字和内置函数/类型作为变量名。真的吗?因为我的程序正在用这行代码删除它们。也不使用,list作为变量名,这只是一个示例为什么需要循环?只需做x=list[:]
来复制列表,然后random.shuffle(x)
这与他想要的正好相反。他每次只想通过for
循环删除一个元素,而不是所有匹配的元素。这正是我所做的。但是如果您这样做,并返回“new”,列表中只有一个元素“new”对我来说等于['red','blue','red','blue','blue']
现在为什么我没有得到相同的结果?代码是完全一样的..我不知道,我检查了我的多次,它工作了。是否要将其粘贴到此处?在代码前后使用此```应该很好:)
def draw(self, n):
if n > len(self.contents):
x = self.contents
self.contents = []
else:
x = []
for ball in range(n):
r = random.choice(self.contents)
x.append(r)
self.contents.remove(r)
return x