从元组中提取字符串-python

从元组中提取字符串-python,python,Python,我有一个元组和一个随机字符串: AllSands = "GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY" found_sand = random.choice(AllSands) 但之后,我想从元组中取出随机字符串,这样就可以再次运行随机部分,而不必使用相同的颜色 元组是不可变的,因此不能删除它们。可以使用较少的元素创建一个新的 >>> AllSands = "GREEN"

我有一个元组和一个随机字符串:

AllSands = "GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"
found_sand = random.choice(AllSands)

但之后,我想从元组中取出随机字符串,这样就可以再次运行随机部分,而不必使用相同的颜色

元组是不可变的,因此不能删除它们。可以使用较少的元素创建一个新的

>>> AllSands = "GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"
>>> AllSands = AllSands[1:]
>>> AllSands
('RED', 'PINK', 'BLACK', 'WHITE', 'ORANGE', 'PURPLE', 'BROWN', 'GREY')
但是,您可能只想迭代洗牌元组:

AllSands = "GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"
>>> all_ = list(AllSands)
>>> random.shuffle(all_)
>>> all_
['WHITE', 'BLACK', 'PURPLE', 'RED', 'PINK', 'ORANGE', 'GREY', 'GREEN', 'BROWN']
>>> random.shuffle(all_)
>>> all_
['GREEN', 'BLACK', 'PURPLE', 'GREY', 'PINK', 'BROWN', 'RED', 'WHITE', 'ORANGE']

元组是不可变的,因此不能删除它们。可以使用较少的元素创建一个新的

>>> AllSands = "GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"
>>> AllSands = AllSands[1:]
>>> AllSands
('RED', 'PINK', 'BLACK', 'WHITE', 'ORANGE', 'PURPLE', 'BROWN', 'GREY')
但是,您可能只想迭代洗牌元组:

AllSands = "GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"
>>> all_ = list(AllSands)
>>> random.shuffle(all_)
>>> all_
['WHITE', 'BLACK', 'PURPLE', 'RED', 'PINK', 'ORANGE', 'GREY', 'GREEN', 'BROWN']
>>> random.shuffle(all_)
>>> all_
['GREEN', 'BLACK', 'PURPLE', 'GREY', 'PINK', 'BROWN', 'RED', 'WHITE', 'ORANGE']

您不能变异
元组
,只能创建新的
元组
s。如果使用
列表
,则更容易操作:

AllSands = ["GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"]
found_sand = random.choice(AllSands)
AllSands.remove(found_sand)
当然,更简单的方法是根据需要洗牌和弹出
O(n)
搜索和复制
remove
的工作:

AllSands = ["GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"]
random.shuffle(AllSands)
found_sand = AllSands.pop()  # Each time you call pop, you "find" a new value    

您不能变异
元组
,只能创建新的
元组
s。如果使用
列表
,则更容易操作:

AllSands = ["GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"]
found_sand = random.choice(AllSands)
AllSands.remove(found_sand)
当然,更简单的方法是根据需要洗牌和弹出
O(n)
搜索和复制
remove
的工作:

AllSands = ["GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"]
random.shuffle(AllSands)
found_sand = AllSands.pop()  # Each time you call pop, you "find" a new value    

我只需要将
AllSands
列成一个列表,然后
shuffle

>>> AllSands = ["GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"]
>>> import random
>>> random.shuffle(AllSands)
>>> AllSands
['BROWN', 'WHITE', 'ORANGE', 'GREY', 'PINK', 'PURPLE', 'GREEN', 'BLACK', 'RED']
如果您知道不需要整个列表,可以使用
sample
intead

>>> random.sample(AllSands, 3)
['PINK', 'BROWN', 'ORANGE']
这些方法比一次选择一个随机项,然后将其从列表/元组中删除更有效

您还可以有一个返回迭代器的函数,如下所示

>>> def shuffler(items):
...     items = list(items)
...     random.shuffle(items)
...     return iter(items)
... 
>>> sands = shuffler(AllSands)
>>> next(sands)
'RED'
>>> next(sands)
'PURPLE'
>>> next(sands)
'WHITE'
>>> next(sands)
'GREEN'

我只需要将
AllSands
列成一个列表,然后
shuffle

>>> AllSands = ["GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"]
>>> import random
>>> random.shuffle(AllSands)
>>> AllSands
['BROWN', 'WHITE', 'ORANGE', 'GREY', 'PINK', 'PURPLE', 'GREEN', 'BLACK', 'RED']
如果您知道不需要整个列表,可以使用
sample
intead

>>> random.sample(AllSands, 3)
['PINK', 'BROWN', 'ORANGE']
这些方法比一次选择一个随机项,然后将其从列表/元组中删除更有效

您还可以有一个返回迭代器的函数,如下所示

>>> def shuffler(items):
...     items = list(items)
...     random.shuffle(items)
...     return iter(items)
... 
>>> sands = shuffler(AllSands)
>>> next(sands)
'RED'
>>> next(sands)
'PURPLE'
>>> next(sands)
'WHITE'
>>> next(sands)
'GREEN'

一种有效的方法是用列表替换元组,并执行以下操作:

AllSands = ["GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"]
index = random.randrange(len(AllSands))
found_sand = AllSands.pop(index)

一种有效的方法是用列表替换元组,并执行以下操作:

AllSands = ["GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"]
index = random.randrange(len(AllSands))
found_sand = AllSands.pop(index)

您可以使用
random.shuffle()
获取所需内容,但如果您确实想从元组中“删除”元素(实际上元组是不可变的),请尝试以下操作:

import random 
AllSands = "GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"
found_sand = random.choice(AllSands)
AllSands = tuple( x for x in AllSands if x != found_sand)
found_sand = random.choice(AllSands)

您可以使用
random.shuffle()
获取所需内容,但如果您确实想从元组中“删除”元素(实际上元组是不可变的),请尝试以下操作:

import random 
AllSands = "GREEN", "RED", "PINK", "BLACK", "WHITE", "ORANGE", "PURPLE", "BROWN", "GREY"
found_sand = random.choice(AllSands)
AllSands = tuple( x for x in AllSands if x != found_sand)
found_sand = random.choice(AllSands)

我喜欢你的回答我喜欢你的回答由于每次调用
pop(index)
时都需要在列表中向下移动一组项,因此它的效率并不高。看到@ShadowRanger的答案了吗?它通过从列表的末尾弹出来避免这个问题。不会移动列表中的一堆项目吗?是的,但只移动一次。这就是O(n)和O(n**2)之间的区别。它的效率并不高,因为每次调用它时,
pop(index)
都需要将一组项向下移动。看到@ShadowRanger的答案了吗?它通过从列表的末尾弹出来避免这个问题。不会移动列表中的一堆项目吗?是的,但只移动一次。这就是O(n)和O(n**2)之间的区别