创建一个包含子字典作为新值的字典,并使用索引作为键

时间:2018-09-25 03:41:44

标签: python dictionary data-structures

我有一个当前设置为

的字典
static class ArrExt
{
    public static int? Get(this int[] arr, int i)
    {
        return (i >= 0 && i < arr.Length) ? arr[i] : default(int?);
    }
}

其中键是分析师名称,值是分析师公司。

我正在尝试创建一个新字典,其中新值是旧的k,v对,而关联的键只是索引int[] sArray = new int[] { 1, 2, 3 }; SomeMethod(sArray.Get(0)); SomeMethod(sArray.Get(1)); SomeMethod(sArray.Get(2)); SomeMethod(sArray.Get(3));

当前代码如下:

{'name': 'firm', 'name':'firm', etc}, 

Current result

每个数字键都被赋予相同的值(1, 2, 3, 4, etc)。我的表情怎么了?

5 个答案:

答案 0 :(得分:1)

您可以枚举项目并将其转换为字典。但是,通常不对字典进行排序。这意味着可以基本上随机分配密钥。

dict(enumerate(analysts.items(), 1))
#{1: ('name1', 'firm1'), 2: ('name2', 'firm2')}

答案 1 :(得分:0)

对此进行枚举和字典理解

d = {'name1': 'firm1', 'name2': 'firm2'}
d2 = {idx: '{}, {}'.format(item, d[item]) for idx, item in enumerate(d, start = 1)}
{1: 'name1, firm1', 2: 'name2, firm2'}

答案 2 :(得分:0)

已经有其他人发布的有效答案。因此,我可能只是提出您自己的解决方案无法正常工作的原因。它可能是由于懒惰的绑定引起的。关于以下内容,有很好的资源:http://quickinsights.io/python/python-closures-and-late-binding/

因为后期绑定实际上会拾取您创建的词典中的最后一个。但是最后一个不是“实际上最后一个”,它由操作系统决定。 (其他人已经对dict数据结构做了一些解释。)

每次在python命令行中运行时,结果可能都会更改。如果将代码放在.py文件中,则每次在IDE中运行时,结果都是一样的。(总是dict中的最后一个)

答案 3 :(得分:0)

在每次迭代期间,根据dict.items()的结果为analysts_dict分配值。 但是,您应该使用comprehension在一行中生成最终结果

例如[{i: e} for i, e in enumerate(analysts.items())]

analysts = {
    "a": 13,
    "b": 123,
    "c": 1234
}
num_analysts = len(analysts.keys())
analysts_dict = [{i: e} for i, e in enumerate(analysts.items())]
print(analysts_dict)

>> [{0: ('a', 13)}, {1: ('b', 123)}, {2: ('c', 1234)}]

答案 4 :(得分:0)

此代码

for k,v in analysts.items(): 
    analysts_dict = dict.fromkeys(range(num_analysts), [k,v])

循环遍历原始dict,并在每次循环迭代中使用范围号作为键来创建一个新的dict。顺便说一下,该字典中的每个项目都共享对单个[k, v]列表对象的引用。通常这是一个坏主意。您只能使用不可变的对象(例如None,数字或字符串)作为dict.fromkeys方法的值arg。该方法的目的是允许您为提供的键创建具有简单默认值的字典,如果您希望将这些列表作为单独的列表,则不能使用它来将列表作为值的字典。 / p>

新的dict对象绑定到名称analysts_dict。在下一个循环迭代中,将创建一个新的dict并将其绑定到该名称,替换上一个循环中刚创建的dict,并销毁替换的dict。

因此,您最终得到一个analysts_dict,其中包含对从原始字典读取的最后一对[k, v]对的引用。

要获得理想的结果,您应该使用DYZ的代码,在此不再赘述。请注意,它将旧名称和公司信息存储在元组中,这比为此应用程序使用列表要好。