【问题标题】:How do I randomly pick an item from one of the lists inside a dictionary, and also get the key for the list?如何从字典中的一个列表中随机选择一个项目,并获取列表的键?
【发布时间】:2012-04-12 22:02:09
【问题描述】:

我有一本列表字典:

lists=dict(animals=["dog","cat","shark"],
           things=["desk","chair","pencil"],
           food=["spaghetti","ice-cream","potatoes"])

如何让 Python 从其中一个列表中随机选择一个项目并告诉我它在哪个列表中?或者我如何从字典中选择一个键,然后从与该键对应的列表中选择一个值?

例如:

狗 - 来自动物 土豆——来自食物

【问题讨论】:

    标签: python list random dictionary


    【解决方案1】:

    random.choice 从序列中随机选择一个项目:

    import random
    

    从您的dict(您已命名为lists)中选择要绘制的键:

    which_list = random.choice(lists.keys())
    

    然后,使用该密钥从dict 获取list

    item = random.choice(lists[which_list])
    

    如果你需要相等的权重:

    import random
    
    which_list, item = random.choice([(name, value) 
                                         for name, values in lists.iteritems() 
                                             for value in values])
    

    【讨论】:

    • 谢谢!工作完美!我已经完成了第一部分,但认为它无法完成第二部分,因为它会将 which_list 部分呈现为不同的列表,从而将其与其项目分离!
    【解决方案2】:

    我马上想到的两种方法:

    • 首先选择一个列表名称(键),然后从中选择一个条目 - 如果列表具有不同的长度,如果您想要均匀分布,则必须小心
    • 将列表的 dict 扁平化为一个 ('list-name','value') 对列表(无论每个列表有多少条目,都更容易获得正确的均匀分布,但需要更多内存)

    前者的一种方法:

    from itertools import chain
    import random
    weight_choices = list(chain(*([name] * len(values) for (name, values) in lists.iteritems()))) # generate a list of the form ("animals", "animals", "animals", ...)
    list_name = random.choice(weight_choice) # The list it's chosen from...
    chosen_item = random.choice(lists[list_name]) # and the item itself
    

    (如果您不关心列表之间的均匀分布:)

    import random
    list_name = random.choice(lists.keys())
    chosen_item = random.choice(lists[list_name])
    

    ...和后一种方法:

    from itertools import chain, repeat
    all_items = list(chain(*((zip(repeat(name), values) for (name, values) in lists.iteritems()))))
    list_name, chosen_item = random.choice(all_items)
    

    对于后者来说,itertools 的方式更少:

    all_items = []
    for name, values in lists.iteritems():
      for value in values:
        all_items.append((name, value))
    list_name, chosen_item = random.choice(all_items)
    

    【讨论】:

    • 他在他的问题中说“或者更确切地说,从字典中选择一个键,然后从所选键中选择一个值。比如:狗 - 来自动物,土豆 - 来自食物”所以想想这一切比必要的复杂得多。
    • 当然,但我不想假设那是他的生产数据。据我所知,可能有 800 个列表,每个列表包含 753 个项目。 (在这种情况下,无论如何我的解决方案都不是非常理想的......)
    • 我没有看到您提出的数据集的幼稚方法存在问题?如果列表长度不均匀,我还为我的答案添加了一个简单的“等重”解决方案。
    • 谢谢,但另一个更简单,每个列表不超过 50 项......所以不需要所有代码!
    • 扁平化是确保选择键值对的概率相等的唯一方法
    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 2012-09-11
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多