Python 如何基于字典键的相同值创建列表
我正在尝试将包含相同日期的字典连接在一起,并创建一个温度值列表,这些常用日期必须提取这些值的最大值和最小值 我有这个:Python 如何基于字典键的相同值创建列表,python,itertools,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':
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'])
在组上迭代,将min和max排序为字典的不同键:
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)
在组上迭代,将min和max排序为字典的不同键:
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)
您可以使用
defaultdict
s构建列表,然后使用列表理解重构词典列表:
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]}]
您可以使用
defaultdict
s构建列表,然后使用列表理解重构词典列表:
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]}]
坚持字典格式可能会更成功:
df = pd.DataFrame(data)
new_data = []
for date in df.date.unique():
df_temp = df[df.date == date]
temp_max = list(df_temp.temp_max)
temp_min = list(df_temp.temp_min)
new_data.append({'date':date, 'temp_max':temp_max, 'temp_min':temp_min})
new_data={}
对于数据中的记录:
如果记录['date']不在新的_data.keys()中:
新数据[记录['date']]={'temp\u max':[],'temp\u min':[]
#附加值
新数据[记录['date']['temp\u max'].追加(记录['temp\u max']))
新数据[记录['date']['temp\u min']追加(记录['temp\u min']))
或者,您可以在熊猫身上执行相同的操作:
df = pd.DataFrame(data)
new_data = []
for date in df.date.unique():
df_temp = df[df.date == date]
temp_max = list(df_temp.temp_max)
temp_min = list(df_temp.temp_min)
new_data.append({'date':date, 'temp_max':temp_max, 'temp_min':temp_min})
作为旁注,了解您使用此操作的目的是为了更好地为更大的用例创建有用的内容,这将非常有帮助。您可能更成功地坚持字典格式:
df = pd.DataFrame(data)
new_data = []
for date in df.date.unique():
df_temp = df[df.date == date]
temp_max = list(df_temp.temp_max)
temp_min = list(df_temp.temp_min)
new_data.append({'date':date, 'temp_max':temp_max, 'temp_min':temp_min})
new_data={}
对于数据中的记录:
如果记录['date']不在新的_data.keys()中:
新数据[记录['date']]={'temp\u max':[],'temp\u min':[]
#附加值
新数据[记录['date']['temp\u max'].追加(记录['temp\u max']))
新数据[记录['date']['temp\u min']追加(记录['temp\u min']))
或者,您可以在熊猫身上执行相同的操作:
df = pd.DataFrame(data)
new_data = []
for date in df.date.unique():
df_temp = df[df.date == date]
temp_max = list(df_temp.temp_max)
temp_min = list(df_temp.temp_min)
new_data.append({'date':date, 'temp_max':temp_max, 'temp_min':temp_min})
作为旁注,了解您使用此操作的目的是为了更好地为您的更大的用例创建有用的东西,这将非常有帮助。只是为了向您展示我在评论中的意思,我的目的是一个dict of dict,而不是一个dict列表:
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]}})
并将收到6月1日的所有Tmin数据:
[68.19, 61.45, 56.77]
为了向大家展示我在评论中的意思,我的目标是写一份口述,而不是一份口述清单:
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]}})
并将收到6月1日的所有Tmin数据:
[68.19, 61.45, 56.77]
我想知道你为什么想要这样的结果。如果您想将同一日期的所有数据收集到一个dict中,那么以日期为键,以Tmin/Tmax dict为值的嵌套dict对我来说似乎更合理—只是如果您真的不想简单地使用熊猫数据帧……我想知道您为什么希望得到这样的结果。如果您想将同一日期的所有数据收集到一个dict中,我觉得以日期为键、以Tmin/Tmax dict为值的嵌套dict更合理——只是如果您真的不想简单地使用熊猫数据框……整洁的方法Austin!问:这是一种比简单地遍历列表和字典中的每一项更有效的方法吗(就像我在下面做的那样)。@YaakovBressler,很高兴看到有人想出了
pandas
。这要归功于你。对我来说,我的方法有点过分了。我只是按照OP的方式去做,最好是按照DYZ的方式去做。谢谢!当你使用我使用的itertools时,给你接受的答案。似乎DYZ的方法也是使用defaultdict.Neat方法解决这个问题的一个很好的替代方法Austin!问:这是一种比简单地遍历列表和字典中的每一项更有效的方法吗(就像我在下面做的那样)。@YaakovBressler,很高兴看到有人想出了pandas
。这要归功于你。对我来说,我的方法有点过分了。我只是按照OP的方式去做,最好是按照DYZ的方式去做。谢谢!当你使用我使用的itertools时,给你接受的答案。似乎DYZ的方法也是使用defaultdict解决这个问题的一个很好的替代方法。