Python 从列表中删除单个项目

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):

所以我试图定义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):
                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