将级联的distionary转换为列表列表

时间:2017-08-03 22:38:08

标签: python list dictionary

我有一个数据类型,它是一个名为'count'的字典的字典

'Count'看起来像这样:

{
  'i0': 
     {0: 3756, 
      20000: 3860, 
      5000: 3794, 
      10000: 3811, 
      25000: 928, 
      15000: 3851
   }, 
  'i1': 
    {0: 3807, 
     20000: 3908, 
     5000: 3794, 
     10000: 3866, 
     25000: 728, 
     15000: 3897
    }, 
  'i2': 
    {0: 3756, 
     20000: 3865, 
     5000: 3822, 
     10000: 3791,
    } 
  }

所以你可以看到'count'是'units'的哈希值:i0,i1,i2 ...... 每个'unit'都是一个哈希,其密钥为'time',值为'txn_count'

我需要创建一个两个列表。

清单1.这将是循环范围[0,5000,10000,... 25000]。问题是这个清单需要包含所有单位的所有时间。正如你所看到的'i2'只有0,5000,10000和20000.但是我需要一个包含所有单位所有可能时间的列表:i0,i1,i2

list 2.这将是显示每单位i0,i1,i2的计数的列表。所以在这种情况下

[[3756, 3794, 3811, 3851, 3860, 928]
 [3807, 3794, 3866, 3897, 3908, 728]
 [3756, 3822, 3791,    0, 3865,   0]]

如您所见,外部列表的索引是单位:i0,i1,i2 内部列表的索引是与时钟对应的txn_count值:0,5000,10,000,15,000,20,000,25,000。

我如何在python中执行此操作,尤其是缺少时钟和未排序字典的挑战。

由于

1 个答案:

答案 0 :(得分:2)

好的,首先要获得您需要的可能值*:

In [15]: possible = sorted({v for val in count.values() for v in val})

In [16]: possible
Out[16]: [0, 5000, 10000, 15000, 20000, 25000]

使用.get字典方法,默认值为0

In [17]: [[v.get(i, 0) for i in possible] for _, v in count.items()]
Out[17]:
[[3756, 3794, 3811, 3851, 3860, 928],
 [3756, 3822, 3791, 0, 3865, 0],
 [3807, 3794, 3866, 3897, 3908, 728]]

现在,如果您需要按键排序,因为字典是无序的,您可以对键进行排序!

In [20]: keys = sorted(count)

In [21]: keys
Out[21]: ['i0', 'i1', 'i2']

In [22]: [[count[k].get(i, 0) for i in possible] for k in keys]
Out[22]:
[[3756, 3794, 3811, 3851, 3860, 928],
 [3807, 3794, 3866, 3897, 3908, 728],
 [3756, 3822, 3791, 0, 3865, 0]]

您可能需要注意如何对这些键进行排序,因为它们是字符串,并且字典顺序可能不是您想要的,但这应该足以让您到达那里。

*对单行的一个小解释:它使用集合理解,这类似于列表理解,但它填充了一个集合,因此它只保留唯一值。它相当于:

temp_set = set()
for val in count.values(): # val will be a dict
    for v in val: # iterates over each key in val
        temp_set.add(v)

集合与dict一样,是无序的,所以我对它们进行排序:

possible = sorted(temp_set)

已编辑添加

假设您要对某些字符串键进行排序,以仅过滤掉以i开头的字符串,并希望按字母后的数字排序,那么您可以这样做:

In [27]: keys = ['i0','i1','i2','f2','s3','d3','i10','i11']

In [29]: sorted([k for k in keys if k.startswith('i')], key=lambda x: int(x[1:]))
Out[29]: ['i0', 'i1', 'i2', 'i10', 'i11']