有一个包含文件的列表'信息。
tables = ["20180512, name=file01, size=100",
"20180512, name=file02, size=90",
"20180513, name=file01, size=70",
"20180513, name=file02, size=70",
"20180513, name=file03, size=80",
"20180514, name=file01, size=100",
"20180514, name=file02, size=90"]
我想制作一本每天最大项目的字典。因此,使用此列表,字典将是
dic_table = {20180512:file01,
20180513:file03,
20180514:file01}
我想我可以通过多个循环和额外的数据结构来做到这一点,但我想知道是否有任何pythonic方法可以有效地完成这项工作。
答案 0 :(得分:1)
pandas
库非常适合此问题:
首先,修改您的数据,以便通过移除size=
和name=
以及不必要的空格轻松进入数据框:
import re
import pandas as pd
tables = [re.sub(r'(\w+=|\s+)', '', i).split(',') for i in tables]
# [['20180512', 'file01', '100'],
# ['20180512', 'file02', '90'],
# ['20180513', 'file01', '70'],
# ['20180513', 'file02', '70'],
# ['20180513', 'file03', '80'],
# ['20180514', 'file01', '100'],
# ['20180514', 'file02', '90']]
然后转换为数据帧:
df = pd.DataFrame(tables, columns=['Date', 'Name', 'Size'])
# Date Name Size
# 0 20180512 file01 100
# 1 20180512 file02 90
# 2 20180513 file01 70
# 3 20180513 file02 70
# 4 20180513 file03 80
# 5 20180514 file01 100
# 6 20180514 file02 90
最后,我们可以使用groupby
和idxmax()
来获取最大值,并使用zip
转换为字典:
df['Size'] = df['Size'].astype(int)
maxes = df.iloc[df.groupby('Date').Size.idxmax()]
# Date Name Size
# 0 20180512 file01 100
# 4 20180513 file03 80
# 5 20180514 file01 100
print(dict(zip(maxes.Date.values, maxes.Name.values)))
# {'20180512': 'file01', '20180513': 'file03', '20180514': 'file01'}
答案 1 :(得分:1)
您可以使用标准库中的itertools.groupby
。
这个想法是对字典理解进行排序,分组,然后使用:
from itertools import groupby
from operator import itemgetter
def tupler(x):
a = x.split(',')
b = a[1].split('=')[-1]
c = a[2].split('=')[-1]
return int(a[0]), b, int(c)
# sort by date and then by size descending
sorter = sorted(map(tupler, tables), key=lambda x: (x[0], -x[2]))
# group by date
grouper = groupby(sorter, key=itemgetter(0))
# extract first item in groups and remove size from result
res = dict(list(j)[0][:-1] for i, j in grouper)
print(res)
{20180512: 'file01',
20180513: 'file03',
20180514: 'file01'}