如何基于字典键的相同值创建列表

时间:2019-06-02 07:10:41

标签: python itertools

我试图将包含相同日期的字典连接在一起,并且还创建一个温度值列表,这些温度值必须包含这些公共日期,然后提取这些值的最大值和最小值。

我有这个:

data = 
[{'temp_min': 51.75, 'date': '2019-05-31', 'temp_max': 52.25}, 
 {'temp_min': 52.5, 'date': '2019-05-31', 'temp_max': 52.87}, 
 {'temp_min': 53.29, 'date': '2019-05-31', 'temp_max': 53.55}, 
 {'temp_min': 68.19, 'date': '2019-06-01', 'temp_max': 75.19}, 
 {'temp_min': 61.45, 'date': '2019-06-01', 'temp_max': 68.45}, 
 {'temp_min': 56.77, 'date': '2019-06-01', 'temp_max': 59.77}]

并想要这个:

[{'date':'2019:05-31', 'temp_min':[51.75, 52.5, 53.29], 'temp_max': 
[52.25, 52.87, 53.55]}, {'date':'2019:06-01','temp_min':[68.19, 
 61.45, 56.77], 'temp_max':[75.19, 68.45, 59.77]}]

我正在尝试使用itertools groupby来执行此操作,但是在尝试创建上述输出时陷入困境。如果对此有其他解决方法,也欢迎您。我不确定如何将分组重新放入字典中以及如何保留唯一日期。

def get_temp(temp):
    return temp['date']

grouping = itertools.groupby(data, get_temp)

for key, group in grouping:
    print(key)
        for d in group:
            print(d['temp_max'])

4 个答案:

答案 0 :(得分:3)

遍历组以排序最小值和最大值以分隔字典的键:

def get_temp(temp):
    return temp['date']

lst = []
for key, group in itertools.groupby(data, get_temp):
    groups = list(group)
    d = {}
    d['date'] = key
    d['temp_min'] = [x['temp_min'] for x in groups]
    d['temp_max'] = [x['temp_max'] for x in groups]
    lst.append(d)

print(lst)

答案 1 :(得分:2)

您可以使用defaultdict来构建列表,然后使用列表理解来重建词典列表:

from collections import defaultdict
mx = defaultdict(list)
mn = defaultdict(list)
for d in data:
  mx[d['date']].append(d['temp_max'])
  mn[d['date']].append(d['temp_min'])

[{'date': k, 'temp_min': mn[k], 'temp_max': mx[k]} for k in mx]
#[{'date': '2019-05-31', 'temp_min': [51.75, 52.5, 53.29], 
# 'temp_max': [52.25, 52.87, 53.55]}, {'date': '2019-06-01',
# 'temp_min': [68.19, 61.45, 56.77], 'temp_max': 
#  [75.19, 68.45, 59.77]}]

答案 2 :(得分:0)

您可能会更成功地坚持词典格式:

httpclient

或者,您可以在熊猫中执行相同的操作:

new_data = {}
for record in data:
  if record['date'] not in new_data.keys():
    new_data[record['date']]={'temp_max':[], 'temp_min' : []}
  # append values
  new_data[record['date']]['temp_max'].append(record['temp_max'])
  new_data[record['date']]['temp_min'].append(record['temp_min'])

作为旁注,了解使用此操作的目的将很有帮助,以便最好地为大型用例创建有用的东西。

答案 3 :(得分:0)

只是为了向您展示我在评论中的意思,其目的是针对一种命令而不是命令列表:

from collections import defaultdict
newdict = defaultdict(dict)

for d in data:
    newdict[d['date']]['Tmin'] = newdict[d['date']].get('Tmin', []) + [d['temp_min']]
    newdict[d['date']]['Tmax'] = newdict[d['date']].get('Tmax', []) + [d['temp_max']]

# defaultdict(<class 'dict'>, {'2019-05-31': {'Tmin': [51.75, 52.5, 53.29], 'Tmax': [52.25, 52.87, 53.55]}, '2019-06-01': {'Tmin': [68.19, 61.45, 56.77], 'Tmax': [75.19, 68.45, 59.77]}})   

这样的好处是您不必搜索存储日期的索引列表。
您可以轻松地做某事

newdict['2019-06-01']['Tmin']

,并将收到6月1日的所有Tmin数据:

[68.19, 61.45, 56.77]