我在挪威的水产养殖电子表格上工作。其中每一行包含特定公司的不同信息(目标、种类、地址等)。我正在写一段代码,打印出从事每一种海洋生物工作的公司数量。到目前为止,这就是我所拥有的
import csv
species = []
with open('Akvakulturregisteret.csv', newline='', encoding='iso-8859-1') as csvfile:
akvareader = csv.reader(csvfile, delimiter=';')
for row in akvareader:
try:
specie = row[-13]
except ValueError:
continue
species.append(specie)
species = list(dict.fromkeys(species))
species.remove("")
species.remove("ART")
companies = []
with open('Akvakulturregisteret.csv', newline='', encoding='iso-8859-1') as csvfile:
akvareader = csv.reader(csvfile, delimiter=';')
for i in range(len(species)):
for row in akvareader:
if row[-13] == species[i]:
company = row[2]
companies.append(company)
companies = list(dict.fromkeys(companies))
print(len(companies))其中第一个打开部分创建了所有不同物种的列表。“‘Regnbue”,“rret”,“Laks”,.然而,第二部分只给出了在名单的第一个元素上工作的公司的数量。它似乎在第一个元素之后停止,并且不会遍历整个列表。如有任何帮助或反馈,将不胜感激。
CSV文件如下所示(这是一列)
A A 0001;969159570;NORGES MILJØ- OG BIOVITENSKAPELIGE;POSTBOKS 5003;1432;ÅS;03-10
1991;;3021;ÅS;Kommersiell;MATFISK;Regnbueørret;000;TN;10362;NERFJØSET;3021;ÅS;LAND;FERSKVANN;6你可以在这里看到整个事情,https://www.fiskeridir.no/Akvakultur/Registre-og-skjema/Akvakulturregisteret。如果你一直向下滚动,就会有一个链接
发布于 2020-11-13 16:49:09
那么,您可以使用defaultdict从collections和使用物种作为键和set()作为您的默认值,然后添加公司到它。最后,把len()放在公司上,你就有了(我想)你想要的。
下面是操作步骤:
import collections
import csv
with open("Akvakulturregisteret.csv", newline="", encoding="iso-8859-1") as f:
reader = csv.reader(f, delimiter=";")
next(reader, None)
next(reader, None)
output = collections.defaultdict(set)
for row in reader:
company, species = row[2], row[12]
output[species].add(company)
for species, companies in dict(output).items():
print(f"{species} - {len(companies)}")这印出了处理它的公司的种类和数量。
Laks - 315
Ørret - 306
Regnbueørret - 305
Rognkjeks (felles) - 48
Gressgylt - 15
Tunge - 9
Grønngylt - 15
Trepigget stingsild - 6
Rødspette - 15
Gapeflyndre - 3
Havabbor - 4
Sandflyndre - 4
Piggvar - 17
Berggylt - 32
Bergnebb - 18
and so on...如果你想要解决这个问题,就用这个:
import collections
import csv
with open("Akvakulturregisteret.csv", newline="", encoding="iso-8859-1") as f:
reader = csv.reader(f, delimiter=";")
next(reader, None)
next(reader, None)
output = collections.defaultdict(set)
for row in reader:
company, species = row[2], row[12]
output[species].add(company)
data = {
k: len(v) for k, v in
sorted(output.items(), key=lambda x: len(x[1]), reverse=True)
}
for species, companies in data.items():
print(f"{species} - {companies}")输出:
Laks - 315
Ørret - 306
Regnbueørret - 305
Torsk - 56
Sukkertare - 55
Butare - 50
Blåskjell - 49
Rognkjeks (felles) - 48
Fingertare - 45
Søl - 40
Østers - 37
Havsalat - 33
Berggylt - 32
Kamskjell - 31
Røye - 27
Kveite - 25
Stortare - 24
Hummer - 22
Fjærehinne uspes - 21
...发布于 2020-11-13 17:22:08
引用您的代码,您不需要使用字典列表,您只需使用一本字典就可以将物种名称作为键保存,并将处理它们的公司数量作为值保存。
所以,在你打开的第一个文件中,你读到了物种,把它们放在字典中,并将它们初始化为零,第二个文件读取公司,并增加每个物种的价值。
import csv
species = dict()
with open('test.csv') as csvfile:
reader = csv.reader(csvfile, delimiter=';')
for row in reader:
try:
specie = row[-13]
except ValueError:
continue
species[specie] = []
print("Len {0}".format(len(species)))
with open('test.csv') as csvfile:
reader = csv.reader(csvfile, delimiter=';')
for row in reader:
for key in species:
if key == row[-13]:
species[key].append(row[2])
for k, v in dict(species).items():
print("Number of companies working on {0} is {1}".format(k, len(v)))如果csv文件很大,我建议更改您的方法,不要读取该文件两次。
https://stackoverflow.com/questions/64824078
复制相似问题