我对我正在尝试修改的当前程序有疑问。 我目前的计划:
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但我不认为它按照预期的方式工作。我在字母类别中排序最麻烦。有没有其他方法/解决方案?
答案 0 :(得分:0)
在致电sorted
时,请替换:
key=lambda x: int(rankednames[x]), reverse = True
使用:
key=lambda x: (x[0], -int(rankednames[x]))
一般的观点是,您始终可以使用tuple
组合两个或更多不同的排序键,其中一个首先使用,另一个作为“打破平局”。具体的一点是我们可以很容易地模拟reverse=True
,因为密钥恰好是一个整数,因此可以否定:这个技巧对字符串密钥不起作用。