动态地将数组中的值分配给字典

时间:2015-11-24 12:05:24

标签: python list python-3.x dictionary

我有问题。它看起来很简单,但我坚持下去。

我有两个变种;一个是一个如下所示的数组:

array = [["a@a.com", 1000], ["b@b.com", 2000], ["c@c.com", 3000]]

另一个字典看起来像这样:

dictionary = {"email": None, "actions": None}

现在我正在尝试动态地将数组中的值分配给字典并将其包装在数组中。

我的代码如下:

result = {"email": None, "actions": None}
new_log = []
for values in sql_result:
    for position in result:
        for index in range(0, len(result)):
            result[position] = str(values[index])

        new_log.append(result)

但它按照我的计划不能正常工作,我得到了奇怪的结果。

打印时new_log如下:

print(str(position) + " : " + str(result[position]))

看起来像:

actions : a@a.com
actions : 1000
email : a@a.com
email : 1000
actions : b@b.com
actions : 2000
email : b@b.com
email : 2000
actions : c@c.com
actions : 3000
email : c@c.com
email : 3000

打印new_log:

 [{'actions': '3000', 'email': '3000'}, {'actions': '3000', 'email': '3000'}, {'actions': '3000', 'email': '3000'}, {'actions': '3000', 'email': '3000'}, {'actions': '3000', 'email': '3000'}, {'actions': '3000', 'email': '3000'}]

我的目标是看起来像这样:

[{'email': 'a@a.com', 'actions': '1000'}, {'email': 'b@b.com', 'actions': '2000'}, {'email': 'c@c.com', 'actions': '3000'}]

4 个答案:

答案 0 :(得分:1)

我会做这样的事情

{k:str(v) for k,v in array}

答案 1 :(得分:1)

您可以简单地将密钥存储在元组中,例如

>>> keys = ('email', 'actions')

然后zip使用列表中的元素,并将其传递给dict函数,就像这样

>>> [dict(zip(keys, item)) for item in array]
[{'actions': 1000, 'email': 'a@a.com'},
 {'actions': 2000, 'email': 'b@b.com'},
 {'actions': 3000, 'email': 'c@c.com'}]

此处,zip函数将合并keysitem中的相应元素并生成新元组。例如,

>>> list(zip(keys, array[0]))
[('email', 'a@a.com'), ('actions', 1000)]

我们使用list函数创建一个列表,因为zip只返回一个迭代器。现在,我们传递这个迭代器,它将元组返回到dict函数,它生成字典。

>>> dict(zip(keys, array[0]))
{'actions': 1000, 'email': 'a@a.com'}

答案 2 :(得分:0)

这个怎么样?

>>> [{"email": i, "actions": str(j)} for i, j in array]
[{'email': 'a@a.com', 'actions': '1000'}, {'email': 'b@b.com', 'actions': '2000'}, {'email': 'c@c.com', 'actions': '3000'}]
>>> 

答案 3 :(得分:0)

首先不需要结果 - 你可以动态创建词典。其次我认为你在错误的地方附加了你,你在两个相同的循环之后做这个。有什么区别:

  $(document).unbind("click").on('click',".sidebar-right li",function(e){
    var found = false;
    var tmp = String($(this).val());
    if (tmp.indexOf("ul") != -1){
      found = true;
    }
    if (($(this).hasClass("menu-item-has-children")) && (!$(this).children('ul').hasClass("highlight")))
    {
      $(this).children("a").addClass("highlight_icon");
      $(this).children('ul').addClass("highlight");
      return false;
    }
    else if (($(this).has("a") && ($(this).has("ul"))) && (!$(this).children('ul').hasClass("highlight")))
    {
      return true;
    }
    else if ($(this).children('ul').hasClass("highlight"))
    {
      $(this).children('a').removeClass("highlight_icon");
      $(this).children('ul').removeClass("highlight");
      return false;
    }
    else 
    {
      return true;
    }

  });

for position in result:

一个给你项目,另一个给你它的索引,但是如果你使用索引来查找项目,那么它基本上是相同的东西。除非由于某种原因需要知道索引,否则通常不会在范围内使用索引。如果您正在使用该索引来查找该项目,那么您做错了。

所以最后两个循环一起给你这种模式:

for index in range(0, len(result))

如同其他人似乎已经指出的那样切入追逐,这可能只是很多更简单 - 就像:

// for position in result (1st iteration)
// for index in range (2 iterations)
actions : a@a.com
actions : 1000
// for position in result (2nd iteration)
// for index in range (2 iterations)
email : a@a.com
email : 1000