【问题标题】:How do I append sorted values in to a dictionary - Python 3.8如何将排序值附加到字典中 - Python 3.8
【发布时间】:2020-09-08 12:26:06
【问题描述】:

我是编程新手,如果有人能指导我从我卡住的地方找到正确的路径,我将不胜感激。我已将 .csv 文件中的值导入字典。 CSV 文件包含以下数据(前 12 行):

Project,Sub_ID,Type
2,6,Full
4,1,Full
6,6,Partial
6,7,Partial
6,8,Full
6,9,Full
6,10,Partial
6,11,Partial
7,4,Full
7,5,Full
7,6,Full

我试图创建一个字典,其中一个键将包含一个项目编号,然后是它的 Sub_IDs 和 Types。基本上,我根据上面提供的 CSV 数据寻求类似于以下输出的内容。

{Project: 2, Sub_ID:(6), Type:(Full)
Project: 5, Sub_ID:(1), Type:(Full)
Project: 6, Sub_ID:(6, 7, 8, 9, 10, 11), Type:(Partial, Partial, Full, Full, Partial, Partial)
Project: 7, Sub_ID:(4, 5, 6), Type:(Full, Full, Full)}

我尝试将 .csv 中的数据合并到一个字典中,并通过字典循环识别哪些项目有多个 sub_ID类型。但是,我无法完成代码以获得所需的输出。我目前使用的代码如下:

import csv, sys
filename = 'Test Data.csv'

file_list = []
with open(filename, 'rb') as f:
    reader = csv.DictReader(f)
    try:
        for row in reader:
            file_list.append(row)
    except csv.Error as e:
        sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))

print file_list

project = []
sub_id = []
type = []
for i in file_list:
    project.append(i["Project"])
    sub_id.append(i["Sub_ID"])
    type.append(i["Type"])

for i, val in enumerate(project):
    if val == project[i-1] or val == project[i+1]  :
        print (i, ",",val," - Have multiple Sub_ID and Type")
    else:
        print (i, ",",val," - Do NOT have multiple Sub_ID and Type ")

任何实现我所需输出的方向或帮助都会非常有帮助。

【问题讨论】:

  • 你提供的输出不是有效的Python,你能提供一个有效的Python输出吗?
  • 我没有 python 输出。我想得到类似的东西。即要分组到单个项目 ID 的 Sub_ID 和类型

标签: python python-3.x csv dictionary


【解决方案1】:

这应该可行:

import csv, sys


filename = 'Test Data.csv'

file_list = []
with open(filename, 'rb') as f:
    reader = csv.DictReader(f)
    try:
        for row in reader:
            file_list.append(row)
    except csv.Error as e:
        sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))

projects = {}
for row in file_list:
    project = int(row["Project"])
    if project not in projects:
        projects[project] = {
            "Sub_ID": [],
            "Type"  : [],
        }
    projects[project]["Sub_ID"].append(int(row["Sub_ID"]))
    projects[project]["Type"].append(row["Type"])

print(projects)

手动打印后输出:

{
    2: {
        "Sub_ID": [6],
        "Type": ["Full"],
    },
    4: {
        "Sub_ID": [1],
        "Type": ["Full"],
    },
    6: {
        "Sub_ID": [6, 7, 8, 9, 10, 11],
        "Type": ["Partial", "Partial", "Full", "Full", "Partial", "Partial"],
    },
    7: {
        "Sub_ID": [4, 5, 6],
        "Type": ["Full", "Full", "Full"],
    },
}

【讨论】:

    【解决方案2】:

    您应该使用数据框(熊猫)

    import pandas as pd
    filename = 'Test Data.csv'
    
    df = pd.read_csv(filename)
    

    然后使用 .iloc 访问各个行:

    df.iloc[0]
    >>> Project       2
        Sub_ID        6
        Type       Full
        Name: 0, dtype: object
    

    如果您仍然需要 dict 样式的输出,请使用以下内容:

    [df.iloc[i].to_dict() for i in range(len(df))]
    

    【讨论】:

    • 谢谢@Nikolaj Kiel。我会试试的
    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 2021-12-21
    • 1970-01-01
    • 2023-02-02
    • 2021-05-17
    • 2020-12-06
    • 2019-03-29
    • 2020-04-09
    相关资源
    最近更新 更多