从包含多列的csv文件中求和特定数据并在python字典中给出结果的方法

2024-09-25 02:28:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我从csv文件中解析了以下数据,格式为job、assembly、nodeLabel、x、y、z

data = [['j1', 'ass1', 1, [0.01, 0.01, 0.01]],
 ['j1', 'ass1', 2, [0.02, 0.02, 0.02]],
 ['j1', 'ass1', 3, [0.03, 0.03, 0.03]],
 ['j1', 'ass2', 1, [0.04, 0.04, 0.04]],
 ['j1', 'ass2', 2, [0.05, 0.05, 0.05]],
 ['j1', 'ass2', 3, [0.06, 0.06, 0.06]],
 ['j2', 'ass1', 1, [0.07, 0.07, 0.07]],
 ['j2', 'ass1', 2, [0.08, 0.08, 0.08]],
 ['j2', 'ass1', 3, [0.09, 0.09, 0.09]],
 ['j2', 'ass2', 1, [0.1, 0.1, 0.1]],
 ['j2', 'ass2', 2, [0.11, 0.11, 0.11]],
 ['j2', 'ass2', 3, [0.12, 0.12, 0.12]],
 ['j3', 'ass1', 1, [0.13, 0.13, 0.13]],
 ['j3', 'ass1', 2, [0.14, 0.14, 0.14]],
 ['j3', 'ass1', 3, [0.15, 0.15, 0.15]],
 ['j3', 'ass2', 1, [0.16, 0.16, 0.16]],
 ['j3', 'ass2', 2, [0.17, 0.17, 0.17]],
 ['j3', 'ass2', 3, [0.18, 0.18, 0.18]]]

现在,我需要为每个部件和节点标签添加基于作业的(j1、j2、j3)x、y、z坐标,并输出为-

{'ass1': {1:[j1x+j2x+j3x, j1y+j2y+j3y, j1z+j2z+j3z], 2: [j1x+j2x+j3x, j1y+j2y+j3y, j1z+j2z+j3z], 3: [...]}, 'ass2': {....}}

**编辑-添加了我提出的部分代码

from collections import defaultdict

csv_content = data

jobDict = defaultdict(list)
for line in csv_content:
    jobDict[line[0]].append(line[1:])

final = defaultdict(dict)
# create assembly dict from job
for ks_j, vs_j in jobDict.items():
    # print(ks_j)
    assemblyDict = defaultdict(list)
    for v_j in vs_j:
        assemblyDict[v_j[0]].append(v_j[1:])

    # create node dict from assembly
    for ks_a, vs_a in assemblyDict.items():
        # print(ks_a)
        nodeDict = defaultdict(dict)
        for v_a in vs_a:
            nodeDict[v_a[0]] = v_a[1]
        # print(nodeDict)

        final[ks_j][ks_a] = nodeDict

print(final)

Tags: csvinforassemblydictvsprintks
1条回答
网友
1楼 · 发布于 2024-09-25 02:28:47

试试这个

data = [['j1', 'ass1', 1, [0.01, 0.01, 0.01]], ['j1', 'ass1', 2, [0.02, 0.02, 0.02]], ['j1', 'ass1', 3, [0.03, 0.03, 0.03]], ['j1', 'ass2', 1, [0.04, 0.04, 0.04]], ['j1', 'ass2', 2, [0.05, 0.05, 0.05]], ['j1', 'ass2', 3, [0.06, 0.06, 0.06]], ['j2', 'ass1', 1, [0.07, 0.07, 0.07]], ['j2', 'ass1', 2, [0.08, 0.08, 0.08]], ['j2', 'ass1', 3, [0.09, 0.09, 0.09]], ['j2', 'ass2', 1, [0.1, 0.1, 0.1]], ['j2', 'ass2', 2, [0.11, 0.11, 0.11]], ['j2', 'ass2', 3, [0.12, 0.12, 0.12]], ['j3', 'ass1', 1, [0.13, 0.13, 0.13]], ['j3', 'ass1', 2, [0.14, 0.14, 0.14]], ['j3', 'ass1', 3, [0.15, 0.15, 0.15]], ['j3', 'ass2', 1, [0.16, 0.16, 0.16]], ['j3', 'ass2', 2, [0.17, 0.17, 0.17]], ['j3', 'ass2', 3, [0.18, 0.18, 0.18]]]

def add(*crd):
    return [sum([c[i] for c in crd]) for i in range(3)]

result= {a:{n: add(*[x[-1] for x in filter(lambda y: (y[2]==n) and (y[1]==a), data)]) for n in set([k[2] for k in data if k[1]==a])} for a in set([r[1]  for r in data])}
print(result)

相关问题 更多 >