关于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"] }

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


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

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']}
%


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

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

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