Python: 获取每家公司最近的日期

2024-04-19 23:15:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个元组列表,由日期和公司名称组成。公司可以列出多个日期的信息:

 [(Company A, datetime.date(1980,1,30)),
  (Company A, datetime.date(1990,1,30)),
  (Company B, datetime.date(1990,1,30)),
  (Company B, datetime.date(2000,1,30))]

我想做的是,有一个列表,其中只包括每个公司的最新可用日期,即结果:

 [(Company A, datetime.date(1990,1,30)),
  (Company B, datetime.date(2000,1,30))]

有什么想法吗?你知道吗


Tags: 名称信息列表datetimedate公司company元组
3条回答

使用itertools的groupby,然后取最大值如何:

import datetime
x = [('Company A', datetime.date(1980,1,30)),
  ('Company A', datetime.date(1990,1,30)),
  ('Company B', datetime.date(1990,1,30)),
  ('Company B', datetime.date(2000,1,30))]

import itertools
out = []
for k,g in itertools.groupby(sorted(x, key = lambda y: y[0]), lambda y: y[0]):
    out.append(max(g, key = lambda y:y[1]))

out
[('Company A', datetime.date(1990, 1, 30)),
 ('Company B', datetime.date(2000, 1, 30))]

下面是一个使用reduce()的示例:

import datetime

company_dates = [
  ('Company A', datetime.date(1980,1,30)),
  ('Company A', datetime.date(1990,1,30)),
  ('Company B', datetime.date(1990,1,30)),
  ('Company B', datetime.date(2000,1,30)),
]

def reducer(acc, company_date):
  try:
    acc[company_date[0]] = max(acc[company_date[0]], company_date[1])
  except KeyError:
    acc[company_date[0]] = company_date[1]

  return acc

sorted = reduce(reducer, company_dates, {})

print sorted.items()

下面是另一个使用不同函数的替代解决方案:

import datetime
import operator

company_dates = [
  ('Company A', datetime.date(1980,1,30)),
  ('Company A', datetime.date(1990,1,30)),
  ('Company B', datetime.date(1990,1,30)),
  ('Company B', datetime.date(2000,1,30)),
]

sorted = sorted(company_dates, key=operator.itemgetter(0, 1), reverse=True)
unique = set([company_date[0] for company_date in sorted])
top = [next(c for c in sorted if c[0] == company) for company in unique]

print top

你也可以用字典。。。你知道吗

data = [('Company A', '1980,1,30'),
  ('Company A', '1990,1,30'),
  ('Company B', '1990,1,30'),
  ('Company B', '2000,1,30')]

datadict = { a:b for a,b in data }

for a, b in data:
    datadict[a] = max(b, datadict[a])

print(datadict)

相关问题 更多 >