【问题标题】:How to select random from list while excluding the previous random choice?如何从列表中随机选择同时排除先前的随机选择?
【发布时间】:2020-09-16 19:17:37
【问题描述】:

我正在尝试创建一个脚本,该脚本允许我在按下按钮时使用 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]

任何帮助将不胜感激!

【问题讨论】:

    标签: python list random


    【解决方案1】:

    只需打乱列表,然后按顺序遍历站点:

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

    【讨论】:

    • 我不知道怎么才能一次完成一个。
    • 我给了你迭代循环;你被困在哪里了?
    【解决方案2】:

    对于单行解决方案:

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

    这会从列表的长度中选择一个随机索引,pops 将其取出(将其从列表中删除)并将其分配给 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']

    【讨论】:

    • 我几乎只是在写相同的答案。你比我快20秒。我建议也保存原始列表,以便在列表中的最后一个站点弹出后能够重新开始。
    • @Karl 这篇文章有一些建议,如果没有看到其余的实现,很难知道什么是理想的。
    • 我认为你缺少一个 len(station_list)
    • @Karl - 我这样做了: def radio_play(): global station_list chosen = station_list.pop(random.randrange(len(station_list))) print(chosen) radio_play = subprocess.call(["mplayer", chosen]) length = len(station_list) if length < 1: station_list = [station1, station2, station3, station4] 它似乎有效!谢谢大家!
    【解决方案3】:

    如果您想要一个解决方案,每次按下按钮都会切换到一个未播放的随机电台,您可以使用这个:

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

    【讨论】:

    • 这看起来会有所帮助,但恐怕我不太了解这里发生的事情(python 新手并且有 1 个已完成的项目:/)。
    • g 是一个生成器,每次调用‘next(g)’时都会从‘yield item’返回一个值。如果你有一个按钮事件,你可以调用‘next(g)’来随机获取不同的站点。
    【解决方案4】:

    从列表中选择某些内容后,使用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多