如何从列表中选择随机,同时排除先前的随机选择?

时间:2020-09-16 19:17:37

标签: python list random

我正在尝试创建一个脚本,允许我在按下按钮时从列表中使用mpg123播放随机的圣诞节广播电台。我遇到的问题是,很多时候,同一广播电台会播放。我在弄乱列表,但是无法正常使用。我还没有连接好按钮,所以我暂停了脚本并再次播放。这是到目前为止的车站。

station1 = "http://185.33.21.112:80/christmas_128"
station2 = "http://71.127.174.26:8020/hollyfm2"
station3 = "http://76.115.146.246:8128"
station4 = "http://85.25.217.22:8050/christmas"

station_list = [station1, station2, station3, station4]

任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:3)

只需对列表进行随机排序,然后依次访问各个电台:

import random
random.shuffle(station_list)
for station in station_list:
    ...

答案 1 :(得分:2)

对于单行解决方案:

chosen = station_list.pop(random.randrange(len(station_list)))

这将从列表的长度中选择一个随机索引,pop将其删除(将其从列表中删除)并将其分配给chosen变量。

另外,如果只想将它们放在列表中,则定义字符串变量是多余的,我会做 station_list = ['http://185.33.21.112:80/christmas_128', 'http://71.127.174.26:8020/hollyfm2', 'http://76.115.146.246:8128', 'http://85.25.217.22:8050/christmas']

答案 2 :(得分:1)

如果您想找到一种解决方案,即每按一次按钮将切换到一个不播放的随机电台,您可以使用以下方法:

import random

def non_repeating(src):
    seq = src[:]
    random.shuffle(seq)
    while True:
        item = seq[0]
        yield item
        seq = seq[1:]
        random.shuffle(seq)
        seq.append(item)

station_list = ['http://185.33.21.112:80/christmas_128', 'http://71.127.174.26:8020/hollyfm2', 'http://76.115.146.246:8128', 'http://85.25.217.22:8050/christmas']

g = non_repeating(station_list)

# The example here is to play 20 stations
for _ in range(20):
    print(next(g))

答案 3 :(得分:0)

从列表中选择某项后,使用del将其从列表中删除。 或保留一个选定列表,然后在先前选定的列表中重新运行。

import random

station1 = "http://185.33.21.112:80/christmas_128"
station2 = "http://71.127.174.26:8020/hollyfm2"
station3 = "http://76.115.146.246:8128"
station4 = "http://85.25.217.22:8050/christmas"

station_list = [station1, station2, station3, station4]

while len(station_list):
    i_sel = random.randint(0, len(station_list)-1)
    sel = station_list[i_sel]
    del station_list[i_sel]
    print(sel)
相关问题