Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将级联的DISTIONAL in转换为列表的列表_Python_List_Dictionary - Fatal编程技术网

Python 将级联的DISTIONAL in转换为列表的列表

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,

我有一个数据类型,它是一个名为“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。。。 每个“单位”是一个散列,其键为“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”
开头,它应该非常简单。此外,您还必须向排序的
传递一个键函数,因为字典排序不是您想要的。