Python-如何以完全随机的顺序将两个列表合并到一个字典中

Python-如何以完全随机的顺序将两个列表合并到一个字典中,python,list,dictionary,Python,List,Dictionary,我见过这样的例子:如何将两个列表合并到一个字典中,使用一个列表的元素作为键,另一个作为值。唯一的问题(最好说是限制)是两个列表的大小必须相等才能实现这一点 假设我有两个列表,如下所示: A = ['SW1', 'SW2', 'SW3', 'SW4'] B = ['N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'N7'] 我要寻找的结果必须是这两个列表以完全随机顺序的联合字典,甚至每个键的值的数量!(每次执行程序时可能会有所不同) e、 g.在第一次跑步时,我随机得到如下

我见过这样的例子:如何将两个列表合并到一个字典中,使用一个列表的元素作为键,另一个作为值。唯一的问题(最好说是限制)是两个列表的大小必须相等才能实现这一点

假设我有两个列表,如下所示:

A = ['SW1', 'SW2', 'SW3', 'SW4']
B = ['N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'N7']
我要寻找的结果必须是这两个列表以完全随机顺序的联合字典,甚至每个键的值的数量!(每次执行程序时可能会有所不同)

e、 g.在第一次跑步时,我随机得到如下结果:

Run1 = {"SW1":["N1"], "SW2":["N2","N3"], "SW3":["N4"], "SW4":["N5", "N6", "N7"] }

在将来的运行中,它可能/应该显示第二个列表元素的不同顺序/编号/分配,作为从第一个列表中获取的每个键的值。这是怎么可能的呢?

这里有一种方法你可以采取

  • 创建一个字典,将
    a
    的每个元素映射到一个空列表

  • 对于
    b
    中的每个元素
    b
    ,随机选择
    A
    中的一个元素,并将
    b
    附加到词典中的相应列表中。您可以使用来进行随机选择


  • 以下是一种随机化一切的方法:

    import random
    
    A = ['SW1', 'SW2', 'SW3', 'SW4']
    B = ['N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'N7']
    
    def randomize_to_dictionary(a, b):
        copy_a = a[:]
        copy_b = b[:]
    
        random.shuffle(copy_a)
        random.shuffle(copy_b)
    
        length_a = len(copy_a)
        length_b = len(copy_b)
    
        dictionary = {}
    
        start = 0
    
        for index, key in enumerate(copy_a):
            end = -1
    
            if index < length_a - 1:
                end = random.randint(start + 1, length_b - (length_a - index))
    
            dictionary[key] = copy_b[start:end]
    
            start = end
    
        return dictionary
    
    print(randomize_to_dictionary(A, B))
    

    您可以将B随机划分为
    len(A)
    分区,然后从中创建字典。看起来您希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在海报已经试图自己解决问题时才提供帮助。演示这项工作的一个好方法是包括您迄今为止编写的代码、示例输入(如果有)、预期输出和实际获得的输出(输出、回溯等)。你提供的细节越多,你可能得到的答案就越多。检查and。@TigerhawkT3不,我不是要你给我写代码,而是要告诉我可能的解决方案,比如我可能不知道的任何现有python函数,这就是为什么我在那里使用“How”!!首先,您将开发一个算法,然后在Python中实现它,最后,测试它。这似乎是一个很好的挑战;没有理由剥夺自己编程的乐趣。这不是很统一。对于B的给定元素,它被分配给a的给定元素的概率是不一致的。特别是,B的第一个元素将始终分配给A的第一个元素。此外,分配给A的给定元素的预期元素数不是恒定的。即使你试图通过洗牌A和B来弥补这一点,我也不认为长度的分布会与“球和箱子”的分布相同。@augurar,分配给A的给定元素的预期元素数量在设计上不是恒定的(请重新阅读OP对问题的描述)B的第一个元素总是被分配给A的第一个元素,这是有意的,也是经过讨论的,也是为了改变这个选择而改变的。你误解了。对于给定的执行,每个A元素的B元素数应该是随机的。但分配的元素数的多少不应取决于元素在A中的位置。例如,如果A有3个元素,B有5个元素,那么A的第一个元素有1/3的几率被分配3个元素,而最后一个元素只有1/9的几率相同。@augurar,我已经将可选的B混洗移到了(现在)函数并添加了A的洗牌。我确实运行了检查列表长度及其值的分布是否合理无偏。我猜这取决于OP对“随机”的定义。该算法倾向于产生列表长度的“倾斜”分布。例如,如果B相对于A较大,那么一个列表包含B元素的一半以上的概率接近1/2。你的步骤1对我来说没有意义,你不应该创建一个字典,将A元素作为键(而不是B),将空列表作为值吗?步骤2可以不为字典中的一个或多个键分配任何元素——OP不讨论此选项。@cdlane步骤1是正确的,谢谢您的更正。对于步骤2,这是正确的。如果OP希望A的每个元素至少有一个B元素,那么这需要修改。但当| B |>| A |发生这种情况的概率变得非常小。
    % python3 test.py
    {'SW4': ['N7', 'N2', 'N3'], 'SW2': ['N5'], 'SW1': ['N1'], 'SW3': ['N4']}
    % python3 test.py
    {'SW3': ['N4', 'N5'], 'SW4': ['N1'], 'SW2': ['N3', 'N6'], 'SW1': ['N2']}
    % python3 test.py
    {'SW1': ['N4'], 'SW3': ['N3'], 'SW2': ['N7', 'N6', 'N5'], 'SW4': ['N2']}
    %