从Python列表创建字典数组

时间:2019-01-08 01:12:59

标签: python arrays json dictionary list-comprehension

我想将散布的值列表转换成字典数组。

我正在尝试列出可以与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}] 

这很接近,但并不能说明每一秒的得分。

8 个答案:

答案 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()

然后,您可以使用以下代码将tmpkeytmpvalue中保存的值分配给字典中的键值对。

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)

这样,您的字典将动态增长,并且制作字典副本的原因是,如果每次将新值添加到列表中时都将更改字典的值,否则将引用字典分配给列表。