我想将散布的值列表转换成字典数组。
我正在尝试列出可以与JSON API一起使用的Python中的预测值列表。有了字典后,我将在其上使用json.dumps
。
my_list = [35, 2.75, 67, 3.45] # in form of: (value, score, value, score)
理想的结果:
my_array_of_dicts = [{'value':35, 'score':2.75}, {'value':67 'score':3.45}]
这就是我尝试过的。
第一次尝试:
d = dict(zip(my_list[::2], my_list[1::2]))
它会产生...
> {35: 2.75,
67: 3.45}
我不确定如何获取自定义密钥。或将每对作为自己的字典。
第二次尝试:
[{'value':i, 'score':i} for i in my_list]]
> [{'value':35, 'score':35}, {'value':2.75, 'score':2.75},
{'value':67, 'score':67}, {'value':3.45, 'score':3.45}]
这很接近,但并不能说明每一秒的得分。
答案 0 :(得分:6)
您真的很接近zip
版本。您只需要制作对象并指定键即可。
my_list = [35, 2.75, 67, 3.45]
[{'value': v, 'score': s} for v, s in zip(my_list[::2], my_list[1::2])]
结果:
[{'value': 35, 'score': 2.75}, {'value': 67, 'score': 3.45}]
答案 1 :(得分:3)
第二次尝试得分:i +1。在循环中,对i进行范围为(0,len(my_list),2)的操作。
答案 2 :(得分:3)
d = map(dict, map(lambda t:zip(('value','score'),t), zip(my_list[::2], my_list[1::2])))
print(list(d))
答案 3 :(得分:3)
尝试一下:
my_list = [35, 2.75, 67, 3.45]
list_of_dicts = [{'value': k, 'score': v} for k, v in zip(iter(my_list), iter(my_list))]
print(list_of_dicts)
输出:
[{'value': 35, 'score': 2.75}, {'value': 67, 'score': 3.45}]
我的解决方案与其他使用列表切片的解决方案之间的时间比较:
In [1]: my_list = [35, 2.75, 67, 3.45] * 100 # making it longer for better testing results
In [2]: def zip_with_slice():
...: return [{'value': v, 'score': s} for v, s in zip(my_list[::2], my_list[1::2])]
...:
In [3]: def zip_with_iter():
...: return [{'value': k, 'score': v} for k, v in zip(iter(my_list), iter(my_list))]
...:
In [4]: %timeit zip_with_slice()
56.5 µs ± 1.27 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [5]: %timeit zip_with_iter()
93 µs ± 2.99 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
如您所见,我使用迭代器的解决方案比使用切片的解决方案快了很多(5-6倍)。
答案 4 :(得分:2)
使用理解力的单线:
[{'value': k, 'score': v} for k, v in [my_list[i: i + 2] for i in range(0, len(my_list), 2)]]
[{'score': 2.75, 'value': 35}, {'score': 3.45, 'value': 67}]
使用您的原始尝试:
[{'value': k, 'score': v} for k,v in zip(my_list[::2], my_list[1::2])]
另一种更详细的方式
from operator import itemgetter
getters = [itemgetter(slice(i, i + 2)) for i in range(0, len(my_list), 2)]
vals = [g(my_list) for g in getters]
def score_vals(s):
k, v = s
return {'value': k, 'score': v}
list(map(score_vals, vals))
答案 5 :(得分:2)
使用列表理解:
>>> my_list = [35, 2.75, 67, 3.45]
>>> my_dict = [{'value': my_list[i], 'score': my_list[i+1]} for i in range(0, len(my_list), 2)]
>>> my_dict
[{'score': 2.75, 'value': 35}, {'score': 3.45, 'value': 67}]
答案 6 :(得分:2)
使用dict
和参数(**kwargs**
)的另一种方法:
>>> my_list = [35, 2.75, 67, 3.45]
>>> [dict(value=x,score=y) for x,y in zip(my_list[::2], my_list[1::2])]
[{'value': 35, 'score': 2.75}, {'value': 67, 'score': 3.45}]
>>>
答案 7 :(得分:0)
class my_dictionary(dict):
# __init__ function
def __init__(self):
self = dict()
# Function to add key:value
def add(self, key, value):
self[key] = value
# Main Function
dict_obj = my_dictionary()
然后,您可以使用以下代码将tmpkey
和tmpvalue
中保存的值分配给字典中的键值对。
dict_obj.key = tmpkey
dict_obj.value = tmpvalue
dict_obj.add(dict_obj.key, dict_obj.value)
要创建字典列表,您需要创建一个空列表,然后在列表的每个元素中分配字典副本。
dicMatrix = []
dictionary_copy = dict_obj.copy()
dicMatrix.append(dictionary_copy)
这样,您的字典将动态增长,并且制作字典副本的原因是,如果每次将新值添加到列表中时都将更改字典的值,否则将引用字典分配给列表。