我有一个数据类型,它是一个名为'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中执行此操作,尤其是缺少时钟和未排序字典的挑战。
由于
答案 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']