首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从csv文件中以嵌套的字典格式分别计数男性和女性

从csv文件中以嵌套的字典格式分别计数男性和女性
EN

Stack Overflow用户
提问于 2021-06-14 20:58:22
回答 3查看 64关注 0票数 3

这段代码运行良好,并以这种格式打印结果。

我需要像这样的嵌套字典格式的结果。

代码语言:javascript
运行
复制
data = {

           'year': {
                    'male': {'Q1': 1, 'Q2': 1, 'Q3': 1, 'Q4': 1, },
                    'female': { 'Q1': 1, 'Q2': 1, 'Q3': 1, 'Q4': 1, }
                   }
       }

代码:

代码语言:javascript
运行
复制
import csv

results = {'males': {}, 'females': {}}

with open('1000 Records.csv') as csv_file:

    csv_reader = csv.reader(csv_file)

    for row in csv_reader:
        year_of_joining = int(row[17])
        quarter_of_joining = row[15]
        gender = 'males' if row[5] == 'M' else 'females'

        if year_of_joining not in results[gender]:
            results[gender][year_of_joining] = {f'Q{i + 1}': 0 for i in range(4)}
        results[gender][year_of_joining][quarter_of_joining] += 1

years = list(results['males'].keys()) + list(results['females'].keys())
years = sorted(list(set(years)))

for year in years:
    count = [results['males'].get(year, 0), results['females'].get(year, 0)]
    print("Male's and Female's: %s: %s" % (year, count))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-15 01:13:26

这是一个有效的解决方案:

代码语言:javascript
运行
复制
import csv
import collections

data= {}

with open('1000 Records.csv') as csv_file:

    csv_reader = csv.reader(csv_file)

    for row in csv_reader:
        year_of_joining = int(row[17])
        quarter_of_joining = row[15]
        gender = 'male' if row[5] == 'M' else 'female'

        if year_of_joining not in data:
            data[year_of_joining]={'male': {f'Q{i + 1}': 0 for i in range(4)}, 'female': {f'Q{i + 1}': 0 for i in range(4)}}
        data[year_of_joining][gender][quarter_of_joining] += 1

data = collections.OrderedDict(sorted(data.items())) # sorting

for year in data:
    print("Male's and Female's: %s: %s" % (year, data[year]))

上面代码中唯一的区别是它给出的输出格式略有不同,但我怀疑这可能是您首先想要的:

代码语言:javascript
运行
复制
Male's and Female's: 1993: {'male': {'Q1': 0, 'Q2': 0, 'Q3': 0, 'Q4': 1}, 'female': {'Q1': 0, 'Q2': 0, 'Q3': 0, 
'Q4': 0}}
Male's and Female's: 1998: {'male': {'Q1': 0, 'Q2': 0, 'Q3': 0, 'Q4': 1}, 'female': {'Q1': 0, 'Q2': 0, 'Q3': 0, 
'Q4': 0}}
Male's and Female's: 1999: {'male': {'Q1': 0, 'Q2': 1, 'Q3': 1, 'Q4': 0}, 'female': {'Q1': 0, 'Q2': 0, 'Q3': 0, 
'Q4': 1}}
Male's and Female's: 2001: {'male': {'Q1': 0, 'Q2': 0, 'Q3': 0, 'Q4': 0}, 'female': {'Q1': 1, 'Q2': 0, 'Q3': 0, 
'Q4': 0}}
Male's and Female's: 2003: {'male': {'Q1': 0, 'Q2': 0, 'Q3': 0, 'Q4': 0}, 'female': {'Q1': 0, 'Q2': 0, 'Q3': 0, 
'Q4': 1}}

如果没有,请让我知道,我会修改它。

票数 1
EN

Stack Overflow用户

发布于 2021-06-15 00:06:30

你已经很接近了。在你的for year in years之外,保留一个字典来存储每年计数的运行结果:

代码语言:javascript
运行
复制
data = {}
for year in years:
    data[year] = {'male':results['males'].get(year, 0), 
                 'female':results['females'].get(year, 0)}
票数 1
EN

Stack Overflow用户

发布于 2021-06-15 01:19:02

我在本应“正常工作”的代码中遇到了一些错误,因此我也修复了这些错误,并在此过程中对其进行了一些优化。下面是使用我为测试目的创建的简单示例CSV文件的结果:

代码语言:javascript
运行
复制
import csv
from pprint import pprint

#YOJ, QOJ, GEN = 17, 15, 3
YOJ, QOJ, GEN = 0, 1, 2  # For testing since no sample CSV provided.


results = {'males': {}, 'females': {}}

with open('1000 Records.csv') as csv_file:
    for row in csv.reader(csv_file):
        year_of_joining = int(row[YOJ])
        quarter_of_joining = int(row[QOJ])
        gender = 'males' if row[GEN] == 'M' else 'females'

        if year_of_joining not in results[gender]:
            results[gender][year_of_joining] = {f'Q{i + 1}': 0 for i in range(4)}

        QOJ_key = f'Q{quarter_of_joining+1}'  # Convert to dict key format.
        results[gender][year_of_joining][QOJ_key] += 1

years = sorted(results['males'].keys() | results['females'].keys())

data = {year: {'males': results['males'][year],
               'females': results['females'][year]}
        for year in years}

pprint(data, sort_dicts=False)

示例输出:

代码语言:javascript
运行
复制
{1980: {'males': {'Q1': 0, 'Q2': 1, 'Q3': 1, 'Q4': 0},
        'females': {'Q1': 0, 'Q2': 0, 'Q3': 1, 'Q4': 0}},
 1981: {'males': {'Q1': 0, 'Q2': 0, 'Q3': 1, 'Q4': 0},
        'females': {'Q1': 0, 'Q2': 0, 'Q3': 0, 'Q4': 2}}}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67970674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档