- 例如,如果我使用此文件: http: //vlm1.uta.edu/~athitsos/courses/cse1310_summer2013/assignments/assignment7/albums.txt 我需要该函数来计算每个频段以及它们在中列出的次数文件并按降序在屏幕上打印。
- 应该是这种格式 band1: number1 band2: number2 band3: number3
这就是我到目前为止所拥有的:
def read_albums(filename): counter = 0 work_list = [] my_file = open(filename, 'r') for line in my_file: my_list = line.split() work_list = line.split() for i in range(0, len(my_list)): item = my_list[0] counter = 1 j = i + 1 for j in range(j, len(my_list)): if j > len(my_list): j = len(my_list) if item == my_list[0]: counter = counter + 1 work_list[j] = None else: continue if work_list[0] != None: print(work_list[0], counter)
关于我做错了什么的任何提示都会非常有帮助,我似乎无法理解
问问题
68 次
3 回答
2
d = defaultdict(int)
with open("some_file.txt") as f:
for line in file:
artist,album = line.split("-")
d[artist] += 1
for k,v in d.items():
print "%s:%s"%(k,v)
于 2013-08-09T00:26:49.370 回答
2
这样的事情将是 Pythonic 的方式:
from collections import Counter
with open('albums.txt') as f:
print Counter(line.split(' - ')[0] for line in f)
我建议你看看这个谈话。
于 2013-08-09T00:26:56.863 回答
0
你已经有了一个可行的答案,所以我只会说你哪里出错了。
my_list = line.split()
work_list = line.split()
它们完全相同,所以我将坚持使用 work_list。
work_list = line.split()
这会在每个空格处拆分文本,因此“Pink Floyd - Album”将变为 [“Pink”、“Floyd”、“-”、“Album”]。此外,它的作用是将变量 work_list 设置为您拆分的最新行。你想要的是将所有分割线放在一个列表中:
work_list.append(line.split("-")[0])
这会正确拆分行并仅返回第一个元素,即乐队名称。然后将其附加到列表 work_list 中,您在开始时已将其正确初始化为空。
一旦你在列表中找到了波段,你可以使用任何方法来计算所有出现的次数。计数器为此非常出色。你的方法有很多逻辑缺陷,但我认为你想要的是(在伪代码中):
for each item in the array (item)
go through all the remaining items (new_item)
if item == new_item
increase counter
这不计算每个项目的出现一次。例如,每次遇到一个乐队时,它都会从那个点开始计算所有重复的乐队。你想要的是一个集合,它就像一个列表,但没有重复的条目。
work_set = set(work_list)
for band in work_set:
counter = 0
for i in range(len(work_list)):
if work_list[i] == band:
counter += 1
print (band, counter)
如果您的程序未按预期运行,您可以打印变量以查看是否为它们分配了您期望的值。
于 2013-08-09T01:37:58.953 回答