Python 从列表创建二进制嵌套方形dict

Python 从列表创建二进制嵌套方形dict,python,Python,从如下列表开始: list = ["1-5", "1-6", "2-5", "2-6", "2-7", "2-8", "3-6", "3-7", "3-8", "4-1"] list1 = ["1-5", "1-6", "2-5", &q

从如下列表开始:

list = ["1-5", "1-6", "2-5", "2-6", "2-7", "2-8", "3-6", "3-7", "3-8", "4-1"]
list1 = ["1-5", "1-6", "2-5", "2-6", "2-7", "2-8", "3-6", "3-7", "3-8", "4-1"]
d={}
for element in list1:
    start=element.split('-')[0]
    d1={}
    for ele in list1:
        if ele.split('-')[0]==start:
            d1[ele]=1
        else:
            d1[ele]=0
    d[element]=d1
print(d)
我需要得到这个命令:

dict = {
    "1-5": {"1-5": 1, "1-6":1, "2-5":0, "2-6":0, "2-7":0, "2-8":0, "3-6":0, "3-7":0, "3-8":0, "4-1":0},
    "1-6": {"1-5": 1, "1-6":1, "2-5":0, "2-6":0, "2-7":0, "2-8":0, "3-6":0, "3-7":0, "3-8":0, "4-1":0},
    "2-5": {"1-5": 0, "1-6":0, "2-5":1, "2-6":1, "2-7":1, "2-8":1, "3-6":0, "3-7":0, "3-8":0, "4-1":0},
    "2-6": {"1-5": 0, "1-6":0, "2-5":1, "2-6":1, "2-7":1, "2-8":1, "3-6":0, "3-7":0, "3-8":0, "4-1":0},
    "2-7": {"1-5": 0, "1-6":0, "2-5":1, "2-6":1, "2-7":1, "2-8":1, "3-6":0, "3-7":0, "3-8":0, "4-1":0},
    "2-8": {"1-5": 0, "1-6":0, "2-5":1, "2-6":1, "2-7":1, "2-8":1, "3-6":0, "3-7":0, "3-8":0, "4-1":0},
    "3-6": {"1-5": 0, "1-6":0, "2-5":0, "2-6":0, "2-7":0, "2-8":0, "3-6":1, "3-7":1, "3-8":1, "4-1":0},
    "3-7": {"1-5": 0, "1-6":0, "2-5":0, "2-6":0, "2-7":0, "2-8":0, "3-6":1, "3-7":1, "3-8":1, "4-1":0},
    "3-8": {"1-5": 0, "1-6":0, "2-5":0, "2-6":0, "2-7":0, "2-8":0, "3-6":1, "3-7":1, "3-8":1, "4-1":0},
    "4-1": {"1-5": 0, "1-6":0, "2-5":0, "2-6":0, "2-7":0, "2-8":0, "3-6":0, "3-7":0, "3-8":0, "4-1":1}
}
基本上,这两个维度是相同的列表。它是一个平方矩阵,二进制值基于以下条件:

If right(i,1) = right(j,1):
    dict[i][j] = 1
    else
    dict[i][j] = 0 
如果元素dict[i][j]的索引i,j以相同的数字开始(可以是多个,例如“11-5”),则dict[i][j]=1,否则dict[i][j]=0

如何用python编写此代码?

您可以编写嵌套的dict comprehension来实现此目的,如下所示:

my_list = ["1-5", "1-6", "2-5", "2-6", "2-7", "2-8", "3-6", "3-7", "3-8", "4-1"]

my_dict = {s: {d: int(d.split('-')[0] == s.split('-')[0]) for d in my_list} for s in my_list}
其中
my_dict
将保存:

{
    '1-5': {'1-5': 1, '1-6': 1, '2-5': 0, '2-6': 0, '2-7': 0, '2-8': 0, '3-6': 0, '3-7': 0, '3-8': 0, '4-1': 0}, 
    '1-6': {'1-5': 1, '1-6': 1, '2-5': 0, '2-6': 0, '2-7': 0, '2-8': 0, '3-6': 0, '3-7': 0, '3-8': 0, '4-1': 0}, 
    '2-5': {'1-5': 0, '1-6': 0, '2-5': 1, '2-6': 1, '2-7': 1, '2-8': 1, '3-6': 0, '3-7': 0, '3-8': 0, '4-1': 0}, 
    '2-6': {'1-5': 0, '1-6': 0, '2-5': 1, '2-6': 1, '2-7': 1, '2-8': 1, '3-6': 0, '3-7': 0, '3-8': 0, '4-1': 0}, 
    '2-7': {'1-5': 0, '1-6': 0, '2-5': 1, '2-6': 1, '2-7': 1, '2-8': 1, '3-6': 0, '3-7': 0, '3-8': 0, '4-1': 0},
    '2-8': {'1-5': 0, '1-6': 0, '2-5': 1, '2-6': 1, '2-7': 1, '2-8': 1, '3-6': 0, '3-7': 0, '3-8': 0, '4-1': 0},
    '3-6': {'1-5': 0, '1-6': 0, '2-5': 0, '2-6': 0, '2-7': 0, '2-8': 0, '3-6': 1, '3-7': 1, '3-8': 1, '4-1': 0},
    '3-7': {'1-5': 0, '1-6': 0, '2-5': 0, '2-6': 0, '2-7': 0, '2-8': 0, '3-6': 1, '3-7': 1, '3-8': 1, '4-1': 0},
    '3-8': {'1-5': 0, '1-6': 0, '2-5': 0, '2-6': 0, '2-7': 0, '2-8': 0, '3-6': 1, '3-7': 1, '3-8': 1, '4-1': 0},
    '4-1': {'1-5': 0, '1-6': 0, '2-5': 0, '2-6': 0, '2-7': 0, '2-8': 0, '3-6': 0, '3-7': 0, '3-8': 0, '4-1': 1}
}
您可以这样尝试:

list = ["1-5", "1-6", "2-5", "2-6", "2-7", "2-8", "3-6", "3-7", "3-8", "4-1"]
list1 = ["1-5", "1-6", "2-5", "2-6", "2-7", "2-8", "3-6", "3-7", "3-8", "4-1"]
d={}
for element in list1:
    start=element.split('-')[0]
    d1={}
    for ele in list1:
        if ele.split('-')[0]==start:
            d1[ele]=1
        else:
            d1[ele]=0
    d[element]=d1
print(d)

我写了一个类似于Moinuddin Quadri的解决方案,其中有一个细微的变化,以避免在内部理解的每个循环中拆分和检索第一个数字

我在Jupyter笔记本电脑中使用%%timeit对这两个选项进行了测试,结果如下:

其他答案:
44µs±3.02µs/圈(7次运行的平均值±标准偏差,每个10000圈)

这个答案:
33.3µs±3.58µs/循环(平均±标准偏差为7次运行,每个循环10000次)

首先,使用从列表中查找索引。然后使用嵌套


谢谢,它工作得很好!它甚至可以与另一个带有两个破折号(例如“122334-6-55323”)的表一起使用,所以读心术也很好:D