我是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
分配一个值,该值是这3个列表中除2之外的数字的列表。
因此,键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]}
我真的不知道如何以这种方式组合这些列表,以便获得所需的输出。
答案 0 :(得分:2)
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]}
答案 1 :(得分:2)
您可以在此处使用defaultdict
:
from collections import defaultdict
mylist = [[0,1], [1,2,8], [3,4], [4,2], [2,5], [5,6,7], [8,9,10,11,12]]
d = defaultdict(list) # a dictionary with all values defaulting to lists
for lst in mylist:
for val in lst:
# extend each list with new values provided they aren't
# equal to the key in question
d[val].extend([x for x in lst if 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 = {}
for lst in mylist:
for val in lst:
if val not in d:
d[val] = [x for x in lst if x!=val]
else:
d[val].extend([x for x in lst if 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
是否在字典中以构建list
,否则,您可以使用extend
就地修改值
答案 2 :(得分:2)
您仅将graph[i]
分配给一行,因此,如果遇到包含i的另一行,则将重新分配初始行的答案。相反,您可能想为graph[i]
分配一个空列表,而不是为graph[i]
附加3个列表。
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)
答案 3 :(得分:1)
您是要专门修复代码还是在寻找解决方案?
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)
这是一种强调清晰度的方法,因此我敢肯定runtime仍需改进。它打印:
{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]}
另外,顺序重要吗?
答案 4 :(得分:1)
.styleGrid{
border: 1px #BDBDBD solid;
background-color: white;
box-shadow: 1px 1px 5px #BDBDBD;
}
.listOrgs{
max-height: 800px;
margin-bottom: 4%;
}
a {
text-decoration: none;
color: black;
}
.my-tree-invisible {
display: none;
}
.my-tree ul,
.my-tree li {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
输出
a=[[0,1], [1,2,8], [3,4], [4,2], [2,5], [5,6,7], [8,9,10,11,12]]
from collections import defaultdict
dic=defaultdict(list)
for i,v in enumerate(a):
for j, v2 in enumerate(v):
new_s=a[i][:j]+a[i][j+1:]
dic[v2].extend(new_s)
for i in dic:
dic[i]=list(set(dic[i]))
print(dict(dic))