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

Python - How to merge two lists into a dictionary in a total random order

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

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

1
2
A = ['SW1', 'SW2', 'SW3', 'SW4']
B = ['N1', 'N2', 'N3', 'N4', 'N5', 'N6', 'N7']

我要查找的结果必须是这两个列表的联合字典,以总的随机顺序,甚至每个键的值的数目!(每执行一次程序时可能会有所不同)。

例如,第一次跑步时,我会随机得到如下信息:

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

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

  • 您可以将b随机分区到len(A)分区中,然后从中创建字典。
  • 看起来你想让我们为你写一些代码。虽然许多用户愿意为陷入困境的编码人员生成代码,但他们通常只在海报已经试图自己解决问题时提供帮助。演示这项工作的一个好方法是包括迄今为止编写的代码、示例输入(如果有)、预期输出和实际获得的输出(输出、回溯等)。你提供的细节越多,你得到的答案就越多。查看常见问题解答以及如何提问。
  • @Tigerhawkt3不,我不是要你给我写代码,而是要告诉我一些可能的解决方案,比如我可能不知道的任何现有的python函数,这就是为什么我在那里使用"如何"的原因!!
  • 首先,您将开发一个算法,然后在Python中实现它,最后测试它。这似乎是一个很好的挑战;没有理由剥夺自己编程的乐趣。


下面是一种随机化所有内容的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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))

上面假设len(b)>=len(a)。如果使用此代码,则应将其作为显式测试。

实例

1
2
3
4
5
6
7
% 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']}
%

  • 这不是很统一。对于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的可选shuffling移到(now)函数中,并添加了a的shuffling。我运行来检查列表长度及其值的分布是否合理无偏。
  • 我想这取决于OP对"随机"的定义。该算法倾向于产生列表长度的"倾斜"分布。例如,如果b相对于a大,那么一个列表包含b元素一半以上的概率接近1/2。


这里有一个方法你可以采取。

  • 创建一个字典,将EDOCX1的每个元素(0)映射到一个空列表。

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

    • 你的步骤1对我来说没有意义,难道你不应该创建一个以a元素为键(而不是b)和空列表为值的字典吗?您的步骤2可以不向字典中的一个或多个键分配任何元素——OP不会讨论这个选项。
    • @cdlane关于步骤1,您是对的,谢谢您的纠正。对于步骤2,这是正确的。如果op希望a的每个元素至少有一个b元素,那么这将需要修改。但当b a发生这种情况的可能性变得非常小。