Python 将列表列表转换为具有唯一键和所有相关值的字典
我是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] 简言之:
[[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,那么来自初始行的答案将被重新分配。相反,您可能希望分配一个