如何从Python中的列表中比较和提取某些项目?

时间:2018-05-14 10:46:22

标签: python list dictionary

有一个包含文件的列表'信息。

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方法可以有效地完成这项工作。

2 个答案:

答案 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

最后,我们可以使用groupbyidxmax()来获取最大值,并使用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'}