如何从列表中的多个字典附加到具有“内部”字典特定部分的另一个列表?

Posted

技术标签:

【中文标题】如何从列表中的多个字典附加到具有“内部”字典特定部分的另一个列表?【英文标题】:How to append from multiple dictionaries in a List to another list with specific parts of the "inner" dictionary? 【发布时间】:2018-08-06 06:41:29 【问题描述】:

我有一个列表中的字典:

fit_statstest = ['activities-heart': ['dateTime': '2018-02-01',
'value': 'customHeartRateZones': [],
 'heartRateZones': ['caloriesOut': 2119.9464,
   'max': 96,
   'min': 30,
   'minutes': 1232,
   'name': 'Out of Range',
  'caloriesOut': 770.2719,
   'max': 134,
   'min': 96,
   'minutes': 120,
   'name': 'Fat Burn',
  'caloriesOut': 0,
   'max': 163,
   'min': 134,
   'minutes': 0,
   'name': 'Cardio',
  'caloriesOut': 0,
   'max': 220,
   'min': 163,
   'minutes': 0,
   'name': 'Peak'],
 'restingHeartRate': 64],
'activities-heart-intraday': 'dataset': ['time': '00:00:00', 'value': 57,
'time': '00:00:10', 'value': 56,
'time': '00:00:20', 'value': 59,
'time': '00:00:35', 'value': 59,
'time': '02:54:10', 'value': 85,
'time': '02:54:20', 'value': 71,
'time': '02:54:30', 'value': 66,
...],'datasetInterval': 1,
'datasetType': 'second',
'activities-heart': ['dateTime': '2018-02-02',
'value': 'customHeartRateZones': [],
 'heartRateZones': ['caloriesOut': 2200.61802,
   'max': 96,
   'min': 30,
   'minutes': 1273,
   'name': 'Out of Range',
  'caloriesOut': 891.9588,
   'max': 134,
   'min': 96,
   'minutes': 133,
   'name': 'Fat Burn',
  'caloriesOut': 35.8266,
   'max': 163,
   'min': 134,
   'minutes': 3,
   'name': 'Cardio',
  'caloriesOut': 0,
   'max': 220,
   'min': 163,
   'minutes': 0,
   'name': 'Peak'],
 'restingHeartRate': 67],
'activities-heart-intraday': 'dataset': ['time': '00:00:10', 'value': 80,
'time': '00:00:15', 'value': 79,
'time': '00:00:20', 'value': 74,
'time': '00:00:25', 'value': 72,
'time': '03:04:10', 'value': 61,
'time': '03:04:25', 'value': 61,
'time': '03:04:40', 'value': 61,
...],
'datasetInterval': 1,
'datasetType': 'second']

我正在尝试将 'time': 'hh:mm:ss' 和 'value': Int 附加到 DataFrame。

这就是我为单个字典所做的(就像一个魅力):

time_list = []
val_list = []
for i in fit_statsHR['activities-heart-intraday']['dataset']:
    val_list.append(i['value'])
    time_list.append(i['time'])

这就是我尝试为多级字典列表做的方式:

time_test = []
val_test = []
for i in fit_statstest:
    val_test.append(i['activities-heart-intraday']['dataset']['value'])
    time_test.append(i['activities-heart-intraday']['dataset']['time'])
heartdftest = pd.DataFrame('Heart Rate':val_test,'Time':time_test)

我收到此错误:列表索引必须是整数或切片,而不是 str;并且不太确定如何解决这个问题。

我尝试使用 .copy() 方法,但也不满意。

更新: @Phydeaux:为此干杯!我试过这个:

time_test = []
val_test = []
j = np.arange(0,len(fit_statstest))

for i in fit_statstest[j]['activities-heart-intraday']['dataset']:
    val_test.append(i['value'])
    time_test.append(i['time'])

我现在收到此错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-184-f3e7484e1cfc> in <module>()
  3 j = np.arange(0,len(fit_statstest))
  4 
----> 5 for i in fit_statstest[j]['activities-heart-intraday']['dataset']:
  6     val_test.append(i['value'])
  7     time_test.append(i['time'])

TypeError: only integer scalar arrays can be converted to a scalar index

只有整数标量数组可以转换为标量索引。不知道我是否走在正确的轨道上!

【问题讨论】:

【参考方案1】:

i['activities-heart-intraday']['dataset'] 是一个包含多个字典的列表,每个字典都有一个'value' 属性。您正在尝试将此列表视为字典,这就是导致您遇到异常的原因。

您对单个字典的代码有正确的想法。您需要遍历列表并对每个项目执行一些操作。


编辑:你不能直接使用np.arange 来索引这样的列表,正如例外所说。你期望它做什么?

试试这个:

time_test = []
val_test = []

# use descriptive names for your loop indices that give a hint about what they represent
for day in fit_statstest:
    for entry in day['activities-heart-intraday']['dataset']:
        time_test.append(entry['time'])
        val_test.append(entry['value'])

【讨论】:

为此干杯!我试过这个: time_test = [] val_test = [] j = np.arange(0,29) for i in fit_statstest[j]['activities-heart-intraday']['dataset']: val_test.append(i[ 'value']) time_test.append(i['time']) heartdftest = pd.DataFrame('Heart Rate':val_test,'Time':time_test) 我现在得到这个错误:只能转换整数标量数组到一个标量索引。不知道我是否走在正确的轨道上! @Vash 你能把它编辑成问题(格式化)吗?在评论中阅读有点困难。此外,一般来说,如果您包含异常的全文(尤其是出现异常的行)会很有帮助。 抱歉弄得一团糟!我现在已将代码和错误添加到问题中。非常感谢!【参考方案2】:

这是通过单个列表理解的一种解决方案:

import pandas as pd

time_values = [(d['time'], d['value']) for day in fit_statstest \
               for d in day['activities-heart-intraday']['dataset']]

df = pd.DataFrame(time_values, columns=['time', 'value'])

结果

        time  value
0   00:00:00     57
1   00:00:10     56
2   00:00:20     59
3   00:00:35     59
4   02:54:10     85
5   02:54:20     71
6   02:54:30     66
7   00:00:10     80
8   00:00:15     79
9   00:00:20     74
10  00:00:25     72
11  03:04:10     61
12  03:04:25     61
13  03:04:40     61

【讨论】:

以上是关于如何从列表中的多个字典附加到具有“内部”字典特定部分的另一个列表?的主要内容,如果未能解决你的问题,请参考以下文章

为字典中的一个键附加多个值[重复]

如何从具有多个数组的字典中获取特定键并存储到放置在表格视图单元格中的字符串中

用循环附加到字典

如何从python中的字典列表中获取值?

附加到 Python 字典中的列表 [重复]

如何将字符串附加到字典中的列表