根据嵌套列表中元素的位置创建字典
Create dictionary from the position of elements in nested lists
我想使用每个列表列表中元素的位置创建一个字典。每个嵌套列表的顺序非常重要,必须保持不变。
原始嵌套列表和所需的字典键:
L_original = [[1, 1, 3], [2, 3, 8]]
keys = ["POS1", "POS2", "POS3"]
所需字典创建自 L_original
:
L_dictionary = {"POS1": [1, 2], "POS2": [1, 3], "POS3": [3, 8]}
到目前为止,我的代码未能满足条件,并在每次迭代的 else
语句处结束。
for i in L_original:
for key, value in enumerate(i):
if key == 0:
L_dictionary[keys[0]] = value
if key == 1:
L_dictionary[keys[1]] = value
if key == 2:
L_dictionary[keys[2]] = value
else:
print(f"Error in positional data processing...{key}: {value} in {i}")
我相信有更简洁的方法来解决这个问题 python API,但其中一个直接的解决方案可能如下:
对于keys
中的每个key
,我们从L_original
的嵌套数组中取出那些与key
具有相同索引的数字,即idx
L_original = [[1, 1, 3], [2, 3, 8]]
keys = ["POS1", "POS2", "POS3"]
L_dictionary = {}
for (idx, key) in enumerate(keys):
L_dictionary[key] = []
for items in L_original:
L_dictionary[key].append(items[idx])
您的代码转到 else
,因为此 else
与 if key == 2
相关,而不是 if
的整个链。因此,例如,如果 key
是 0
,则流程会转到 else
,因为 0 != 2
。要解决此问题,应将第二个和后续 if
替换为 elif
。这将 else
与整个链相关联:
if key == 0:
# only when key is 0
elif key == 1:
# only when key is 1
elif key == 2:
# only when key is 2
else:
# otherwise (not 0, not 1, not 2)
在枚举时使用列表理解
L_dictionary = dict()
for i, k in enumerate(keys):
L_dictionary[k] = [x[i] for x in L_original]
或者干脆
L_dictionary = {k: [x[i] for x in L_original] for i, k in enumerate(keys)}
L_original = [[1, 1, 3], [2, 3, 8]]
keys = ["POS1", "POS2", "POS3"]
b=[list(x) for x in zip(L_original[0], L_original[1])]
a={i:b[index] for index,i in enumerate(keys)}
首先,我刚刚创建了一个新列表,方法是将第一个嵌套列表的索引压缩(see zip) 到其他嵌套列表的相同索引。
Output of b: [[1, 2], [1, 3], [3, 8]]
然后使用 keys
的索引创建字典:b
列表的索引。
Output of a: {'POS1': [1, 2], 'POS2': [1, 3], 'POS3': [3, 8]}
我想使用每个列表列表中元素的位置创建一个字典。每个嵌套列表的顺序非常重要,必须保持不变。
原始嵌套列表和所需的字典键:
L_original = [[1, 1, 3], [2, 3, 8]]
keys = ["POS1", "POS2", "POS3"]
所需字典创建自 L_original
:
L_dictionary = {"POS1": [1, 2], "POS2": [1, 3], "POS3": [3, 8]}
到目前为止,我的代码未能满足条件,并在每次迭代的 else
语句处结束。
for i in L_original:
for key, value in enumerate(i):
if key == 0:
L_dictionary[keys[0]] = value
if key == 1:
L_dictionary[keys[1]] = value
if key == 2:
L_dictionary[keys[2]] = value
else:
print(f"Error in positional data processing...{key}: {value} in {i}")
我相信有更简洁的方法来解决这个问题 python API,但其中一个直接的解决方案可能如下:
对于keys
中的每个key
,我们从L_original
的嵌套数组中取出那些与key
具有相同索引的数字,即idx
L_original = [[1, 1, 3], [2, 3, 8]]
keys = ["POS1", "POS2", "POS3"]
L_dictionary = {}
for (idx, key) in enumerate(keys):
L_dictionary[key] = []
for items in L_original:
L_dictionary[key].append(items[idx])
您的代码转到 else
,因为此 else
与 if key == 2
相关,而不是 if
的整个链。因此,例如,如果 key
是 0
,则流程会转到 else
,因为 0 != 2
。要解决此问题,应将第二个和后续 if
替换为 elif
。这将 else
与整个链相关联:
if key == 0:
# only when key is 0
elif key == 1:
# only when key is 1
elif key == 2:
# only when key is 2
else:
# otherwise (not 0, not 1, not 2)
在枚举时使用列表理解
L_dictionary = dict()
for i, k in enumerate(keys):
L_dictionary[k] = [x[i] for x in L_original]
或者干脆
L_dictionary = {k: [x[i] for x in L_original] for i, k in enumerate(keys)}
L_original = [[1, 1, 3], [2, 3, 8]]
keys = ["POS1", "POS2", "POS3"]
b=[list(x) for x in zip(L_original[0], L_original[1])]
a={i:b[index] for index,i in enumerate(keys)}
首先,我刚刚创建了一个新列表,方法是将第一个嵌套列表的索引压缩(see zip) 到其他嵌套列表的相同索引。
Output of b: [[1, 2], [1, 3], [3, 8]]
然后使用 keys
的索引创建字典:b
列表的索引。
Output of a: {'POS1': [1, 2], 'POS2': [1, 3], 'POS3': [3, 8]}