Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将列表列表转换为具有唯一键和所有相关值的字典_Python_List_Dictionary - Fatal编程技术网

Python 将列表列表转换为具有唯一键和所有相关值的字典

Python 将列表列表转换为具有唯一键和所有相关值的字典,python,list,dictionary,Python,List,Dictionary,我是python新手,目前正努力解决一个问题。我有一份清单: [[0,1],[1,2,8],[3,4],[4,2],[2,5],[5,6,7],[8,9,10,11,12]。 我的目标是用它制作一本字典,格式如下: {0:[1],1:[2,8],2:[8,1,4,5],3:[4],5:[6,7,2],6:[5,7],7:[5,6],8:[1,2,10,9,11,12],9:[8,10,11,12],10:[8,9,11,12],11:[12,10,9,8],12:[11,9,10,8] 简言之:

我是python新手,目前正努力解决一个问题。我有一份清单:

[[0,1],[1,2,8],[3,4],[4,2],[2,5],[5,6,7],[8,9,10,11,12]。

我的目标是用它制作一本字典,格式如下:

{0:[1],1:[2,8],2:[8,1,4,5],3:[4],5:[6,7,2],6:[5,7],7:[5,6],8:[1,2,10,9,11,12],9:[8,10,11,12],10:[8,9,11,12],11:[12,10,9,8],12:[11,9,10,8]

简言之:

在这种情况下,它必须创建一个具有从1到12的唯一键的字典(列表中的所有唯一数字),并为每个键分配一个值列表,这是该键的一个公共子集,即对于键
2
,它出现在列表
[4,2],[2,5],[1,2,8]
因此它必须为键
2
分配一个值,该值是除2之外的3个列表中的数字列表

因此,键
2
的输出应该是:
2:[8,1,4,5]

我编写了一些代码:

data = [[0,1], [1,2,8], [3,4], [4,2], [2,5], [5,6,7], [8,9,10,11,12]]

graph = {}
for i in range(13):
    graph[i] = 3

numbers = list(range(0,13))
for row in data:
    for i in graph.keys():
        if i in row:
            graph[i] = row

for key,value in graph.items():
    graph[key] = graph[key][1:]

print(graph)
然而,它给了我输出:

{0:[1],1:[2,8],2:[5],3:[4],4:[2],5:[6,7],6:[6,7],7:[6,7],8:[9,10,11,12],9:[9,10,11,12],10:[9,10,11,12],11:[9,10,11,12],12:[9,10,11,12]


我真的不知道如何将这些列表组合在一起,以便获得所需的输出。

您是想专门修复代码,还是只是想找到解决方案

data = [[0,1], [1,2,8], [3,4], [4,2], [2,5], [5,6,7], [8,9,10,11,12]]
n = 12

# Create dict with empty list for each key
result = {key: [] for key in range(n + 1)}

for key in result:
    for x in data:
        if key in x:
            # We need to make a copy of `x` because otherwise we'd modify `data`
            x = x.copy()
            x.remove(key)
            result[key].extend(x)

print(result)
这是一种强调清晰性的方法,因此我相信仍然可以改进。它打印:

{0: [1], 1: [0, 2, 8], 2: [1, 8, 4, 5], 3: [4], 4: [3, 2], 5: [2, 6, 7], 6: [5, 7], 7: [5, 6], 8: [1, 2, 9, 10, 11, 12], 9: [8, 10, 11, 12], 10: [8, 9, 11, 12], 11: [8, 9, 10, 12], 12: [8, 9, 10, 11]}

此外,顺序是否重要?

您是想专门修复代码,还是只是想寻找解决方案

data = [[0,1], [1,2,8], [3,4], [4,2], [2,5], [5,6,7], [8,9,10,11,12]]
n = 12

# Create dict with empty list for each key
result = {key: [] for key in range(n + 1)}

for key in result:
    for x in data:
        if key in x:
            # We need to make a copy of `x` because otherwise we'd modify `data`
            x = x.copy()
            x.remove(key)
            result[key].extend(x)

print(result)
d=dict()
entries=[]
for i in range(0,13):
    entries=[]
    for j in data:
        if i in j:
            entries+=[num for num in j if num!=i]
    d[i]=entries
这是一种强调清晰性的方法,因此我相信仍然可以改进。它打印:

{0: [1], 1: [0, 2, 8], 2: [1, 8, 4, 5], 3: [4], 4: [3, 2], 5: [2, 6, 7], 6: [5, 7], 7: [5, 6], 8: [1, 2, 9, 10, 11, 12], 9: [8, 10, 11, 12], 10: [8, 9, 11, 12], 11: [8, 9, 10, 12], 12: [8, 9, 10, 11]}
还有,顺序重要吗

d=dict()
entries=[]
for i in range(0,13):
    entries=[]
    for j in data:
        if i in j:
            entries+=[num for num in j if num!=i]
    d[i]=entries
输出

{0: [1],
 1: [0, 2, 8],
 2: [1, 8, 4, 5],
 3: [4],
 4: [3, 2],
 5: [2, 6, 7],
 6: [5, 7],
 7: [5, 6],
 8: [1, 2, 9, 10, 11, 12],
 9: [8, 10, 11, 12],
 10: [8, 9, 11, 12],
 11: [8, 9, 10, 12],
 12: [8, 9, 10, 11]}
输出

{0: [1],
 1: [0, 2, 8],
 2: [1, 8, 4, 5],
 3: [4],
 4: [3, 2],
 5: [2, 6, 7],
 6: [5, 7],
 7: [5, 6],
 8: [1, 2, 9, 10, 11, 12],
 9: [8, 10, 11, 12],
 10: [8, 9, 11, 12],
 11: [8, 9, 10, 12],
 12: [8, 9, 10, 11]}
您可以在此处使用:

从集合导入defaultdict
mylist=[[0,1]、[1,2,8]、[3,4]、[4,2]、[2,5]、[5,6,7]、[8,9,10,11,12]]
d=defaultdict(list)#所有值默认为list的字典
对于mylist中的lst:
对于lst中的val:
#使用新值扩展每个列表,前提是这些值不是
#与所讨论的关键相同
d[val].扩展([x表示lst中的x,如果x!=val])
D
# {0: [1], 1: [0, 2, 8], 2: [1, 8, 4, 5], 8: [1, 2, 9, 10, 11, 12], 3: [4], 4: [3, 2], 5: [2, 6, 7], 6: [5, 7], 7: [5, 6], 9: [8, 10, 11, 12], 10: [8, 9, 11, 12], 11: [8, 9, 10, 12], 12: [8, 9, 10, 11]}
通过使用defaultdict,您不必担心在默认情况下为值分配列表,因此您只需使用标准的
list
属性,如
append
extend

在迭代
lst
N+1次时,需要考虑性能,其中N是
lst
的长度
extend
是一个O(N)操作,因此构建列表和扩展现有列表并不完全有效。它也不会考虑重复的值(如果这对您很重要的话)。但是,它比尝试使用标准的
dict
要干净一些,您可以这样做:

d={}
对于mylist中的lst:
对于lst中的val:
如果val不在d中:
d[val]=[x表示lst中的x,如果x!=val]
其他:
d[val].扩展([x表示lst中的x,如果x!=val])
D
# {0: [1], 1: [0, 2, 8], 2: [1, 8, 4, 5], 8: [1, 2, 9, 10, 11, 12], 3: [4], 4: [3, 2], 5: [2, 6, 7], 6: [5, 7], 7: [5, 6], 9: [8, 10, 11, 12], 10: [8, 9, 11, 12], 11: [8, 9, 10, 12], 12: [8, 9, 10, 11]}
如果您必须检查字典中是否有
val
,以构建
列表
,否则,您可以使用
extend

修改相应的值,您可以在此处使用:

从集合导入defaultdict
mylist=[[0,1]、[1,2,8]、[3,4]、[4,2]、[2,5]、[5,6,7]、[8,9,10,11,12]]
d=defaultdict(list)#所有值默认为list的字典
对于mylist中的lst:
对于lst中的val:
#使用新值扩展每个列表,前提是这些值不是
#与所讨论的关键相同
d[val].扩展([x表示lst中的x,如果x!=val])
D
# {0: [1], 1: [0, 2, 8], 2: [1, 8, 4, 5], 8: [1, 2, 9, 10, 11, 12], 3: [4], 4: [3, 2], 5: [2, 6, 7], 6: [5, 7], 7: [5, 6], 9: [8, 10, 11, 12], 10: [8, 9, 11, 12], 11: [8, 9, 10, 12], 12: [8, 9, 10, 11]}
通过使用defaultdict,您不必担心在默认情况下为值分配列表,因此您只需使用标准的
list
属性,如
append
extend

在迭代
lst
N+1次时,需要考虑性能,其中N是
lst
的长度
extend
是一个O(N)操作,因此构建列表和扩展现有列表并不完全有效。它也不会考虑重复的值(如果这对您很重要的话)。但是,它比尝试使用标准的
dict
要干净一些,您可以这样做:

d={}
对于mylist中的lst:
对于lst中的val:
如果val不在d中:
d[val]=[x表示lst中的x,如果x!=val]
其他:
d[val].扩展([x表示lst中的x,如果x!=val])
D
# {0: [1], 1: [0, 2, 8], 2: [1, 8, 4, 5], 8: [1, 2, 9, 10, 11, 12], 3: [4], 4: [3, 2], 5: [2, 6, 7], 6: [5, 7], 7: [5, 6], 9: [8, 10, 11, 12], 10: [8, 9, 11, 12], 11: [8, 9, 10, 12], 12: [8, 9, 10, 11]}

如果您必须检查字典中是否有
val
来构建
列表
,否则,您可以使用
extend

graph[i]
分配给一行,因此如果您遇到另一行包含i,则会重新分配初始行的答案。相反,您可能希望为
graph[i]
分配一个空列表,而不是将3追加到
graph[i]

graph = {}
for i in range(13):
  graph[i] = []

for row in data:
  for i in graph.keys():
    if i in row:
      for val in row:
        if val != i:
          graph[i].append(val)

您只将
graph[i]
分配给一行,因此如果您遇到另一行包含i,那么来自初始行的答案将被重新分配。相反,您可能希望分配一个