Python 将级联的DISTIONAL in转换为列表的列表
我有一个数据类型,它是一个名为“count”的字典的字典 “Count”如下所示:Python 将级联的DISTIONAL in转换为列表的列表,python,list,dictionary,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,
{
'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。。。
每个“单位”是一个散列,其键为“time”,值为“txn_count”
我需要创建一个两个列表
清单1。这将是循环范围[0,5000,10000,…25000]。问题是这个列表需要包含所有单元的所有时间。正如您所看到的,“i2”只有0、5000、10000和20000。但我需要一个列表,其中包含所有单位的所有可能时间:i0、i1、i2
清单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_计数值:0、5000、10000、15000、20000、25000
我如何在python中做到这一点,特别是在缺少时钟和未排序字典的情况下
谢谢好的,首先获取您需要的可能值*:
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
s)是无序的,因此我对它们进行排序:
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']
谢谢我不能在这里使用范围函数。因为我的数据不会总是递增5000,而且我还需要计算范围的开始/结束。@Romeo好的,那么你必须对数据进行几次传递以进行整理。我已经更新了解决方案。很酷的解决方案!你能解释一下这一行的作用吗:排序({v代表count中的val.values()代表val中的v})以及如何只过滤i0、i1、i2..i99等单位。我还有t0、t1、s11、s32和其他单位。@Romeo为您的关键问题添加了解释和快速解决方案。。。假设您想要的键(并且只有那些键)以
“i”
开头,它应该非常简单。此外,您还必须向排序的传递一个键函数,因为字典排序不是您想要的。