从元组中提取字符串

2024-10-04 03:22:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: 字符串randomgreenredgrey元组blackwhite
3条回答

我只需要做一个列表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']

如果您知道不需要整个列表,那么可以使用sampleintead

>>> 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'

不能对tuple进行变异,只能创建新的tuple。如果使用list,则更容易做到:

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

当然,更简单的方法是根据需要洗牌和pop,这样就消除了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 = "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']

相关问题 更多 >