更复杂的排序:如何分类数据并对类别中的数据进行排序? (蟒蛇)

时间:2015-07-12 23:50:05

标签: python python-2.7 sorting

我对我正在尝试修改的当前程序有疑问。 我目前的计划:

def extract_names(filename):
  names = []
  f = open(filename, 'rU')
  text = f.read()

  yearmatch = re.search(r'Popularity\sin\s(\d\d\d\d)', text)
  if not yearmatch:
    sys.stderr.write('unavailable year\n')
    sys.exit(1)
  year = yearmatch.group(1)
  names.append(year)

  yeartuples = re.findall(r'<td>(\d+)</td><td>(\w+)</td>\<td>(\w+)</td>', text)#finds all patterns of date, boyname, and girlname, creates tuple)

  rankednames = {}
  for rank_tuple in yeartuples:
    (rank, boyname, girlname) = rank_tuple
    if boyname not in rankednames:
      rankednames[boyname] = rank
    if girlname not in rankednames:
      rankednames[girlname] = rank
  sorted_names = sorted(rankednames.keys(), key=lambda x: int(rankednames[x]), reverse = True)
  for name in sorted_names:
    names.append(name + " " + rankednames[name])
  return names[:20]
#Boilerplate from this point**

def main():

  args = sys.argv[1:]

  if not args:
    print 'usage: [--summaryfile] file [file ...]'
    sys.exit(1)

  summary = False
  if args[0] == '--summaryfile':
    summary = True
    del args[0]

  for filename in args:
    names = extract_names(filename)
    text = '\n'.join(names)

    if summary:
      outf = open(filename + '.summary', 'w')
      outf.write(text + '\n')
      outf.close()
    else:
      print text

if __name__ == '__main__':
  main()

从网站上获取有关某一年份中某一年最受欢迎的babynames的信息,使用此数据创建一个列表,并按照从最低等级(1000)到最高等级的顺序打印出一个babynames列表( 1)。我试图做的修改应该按字母(第一个)排序所有的名字,但是在每组字母(所有的一组,所有b&#39s等的组中)中对我进行排序。我是尝试按字母组中的降序排序名称,因此以a开头的排名最低的名称将是显示的第一个名称。我已经为每个字母尝试过re.search但我不认为它按照预期的方式工作。我在字母类别中排序最麻烦。有没有其他方法/解决方案?

1 个答案:

答案 0 :(得分:0)

在致电sorted时,请替换:

key=lambda x: int(rankednames[x]), reverse = True

使用:

key=lambda x: (x[0], -int(rankednames[x]))

一般的观点是,您始终可以使用tuple组合两个或更多不同的排序键,其中一个首先使用,另一个作为“打破平局”。具体的一点是我们可以很容易地模拟reverse=True,因为密钥恰好是一个整数,因此可以否定:这个技巧对字符串密钥不起作用。