我有一个数组,看起来像:
my_array = 'limit: 1001: [1,2], 1002:[2,5], 1003:[1,2],1010:[1,3]
但是我想像这样拆分我的数组:
[1001,1], [1001,2], [1002,2], [1002,5], [1003,1], [1003,2]....
在 Python 中有可能吗?
我试过这个:
[[[c for c in v.split(':')][0],a.split('(')[0]] for v in my_array.replace(' ','').split('limit:')[1].replace('),',';').replace('[','').replace('),',';').split(',') for a in [c for c in v.split(':')][1].split(';')]
ast.literal_eval()
似乎更直接:
import ast
my_array = 'limit: 1001: [1,2], 1002:[2,5], 1003:[1,2],1010:[1,3]'
my_array = '{' + my_array[6:] + '}'
my_dict = ast.literal_eval(my_array)
arr = [[key, i] for key, item in my_dict.items() for i in item]
print(arr)
输出:
[[1001, 1], [1001, 2], [1002, 2], [1002, 5], [1003, 1], [1003, 2], [1010, 1], [1010, 3]]
要自己解析这个,我建议分小步打破这个过程:
my_array = 'limit: 1001: [1,2], 1002:[2,5], 1003:[1,2],1010:[1,3]'
parts = [*map(str.strip,my_array.split(":")[1:])]
leftParts = [ part.rsplit(",")[-1] for part in parts[:-1]]
rightParts = [ part.split("]")[0][1:].split(",") for part in parts[1:]]
result = [ [L,R] for L,Rs in zip(map(int,leftParts),rightParts)
for R in map(int,Rs) ]
[[1001, 1], [1001, 2], [1002, 2], [1002, 5], [1003, 1], [1003, 2],
[1010, 1], [1010, 3]]
parts
在“:”上分隔字符串,因为它是唯一没有歧义的分隔符(与逗号相反)。您会得到组合连续但不相关的左右部分的子字符串。在执行此操作时,我们跳过“限制”关键字并消除前导/尾随空白以简化后续步骤。
leftParts
提取“:”之前的数字。这些现在位于每个部分的末尾,前面有一个逗号(或者在第一部分的情况下单独使用)。所以我们使用 rsplit 来获取最后一个逗号之后的子字符串。 parts
中的最后一部分永远不会包含 leftPart,因为它后面没有新的条目(所以我们只为此处理 parts[:-1])
rightParts
提取括号内的列表。它首先在右括号处拆分并选择它前面的子字符串(索引 0)。左括号被跳过,封闭的列表用逗号分隔。 parts
中的第一部分仅包含左侧值,因此我们跳过它(即为此仅处理 parts[1:])
我们现在有一个左侧字符串列表 (
leftParts
) 和一个右侧列表列表 (rightParts
)
结果是通过使用 zip() 将左右部分配对并使用嵌套理解将每个左侧值与所有相应的右侧值组合起来而构建的。从字符串到整数的转换也在这一步中进行