如何按列中的两个输入值分组并在

2024-05-13 05:24:40 发布

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

电流输入:

reg1 test1 f day1
reg1 test2 p day1
reg1 test3 p day2
reg1 test2 p day2
reg1 test2 p day3
reg1 test4 f day3

期望输出:

reg   test  day1 day2 day3
reg1  test1   f   -    -
reg1  test2   p   p    p
reg1  test3   -   p    -
reg1  test4   -   -    f

如何从当前输入中获得所需的输出?我只想使用python的内置特性,因为我无法下载pandas、tablate等库


Tags: testpandas特性reg内置电流test1test2
2条回答

这似乎是一个加载和卸载嵌套词典的简单任务。我曾经系统标准例如,您的代码可能来自open(),因此您可以抛出sys的导入:

import sys

dictionary = {}

days = set()

for line in sys.stdin:
    reg, test, letter, day = line.rstrip().split(' ')

    if reg not in dictionary:
        dictionary[reg] = dict()

    if test not in dictionary[reg]:
        dictionary[reg][test] = dict()

    if day not in dictionary[reg][test]:
        dictionary[reg][test][day] = dict()

    dictionary[reg][test][day] = letter

    days.add(day)

days = sorted(list(days))

print("reg", "test#", *days, sep="\t")

for reg in sorted(dictionary):
    reg_dict = dictionary[reg]

    for test in sorted(reg_dict):
        test_dict = reg_dict[test]

        letters = [test_dict[day] if day in test_dict else "-" for day in days]

        print(reg, test, *letters, sep="\t")

(更改拆分字符以匹配实际输入。)不完美,但基本上有效:

reg     test#   day1    day2    day3
reg1    test1   f       -       -
reg1    test2   p       p       p
reg1    test3   -       p       -
reg1    test4   -       -       f

假设你的数据在stuff.csv。从加载开始

tups = [l.strip().split(' ') for l in open('stuff.csv') if l.strip()]
>>> tups
[['reg1', 'test1', 'f', 'day1'],
 ['reg1', 'test2', 'p', 'day1'],
 ['reg1', 'test3', 'p', 'day2'],
 ['reg1', 'test2', 'p', 'day2'],
 ['reg1', 'test2', 'p', 'day3'],
 ['reg1', 'test4', 'f', 'day3']]

现在找到所有可能的日子

days = sorted(set(tup[3] for tup in tups))
>>> days
{'day1', 'day2', 'day3'}

现在计算regs和tests的所有条目

from collections import defaultdict

d = defaultdict(dict)
for tup in tups:
    d[(tup[0], tup[1])][tup[3]] = tup[2]
>>> d
defaultdict(dict,
            {('reg1', 'test1'): {'day1': 'f'},
             ('reg1', 'test2'): {'day1': 'p', 'day2': 'p', 'day3': 'p'},
             ('reg1', 'test3'): {'day2': 'p'},
             ('reg1', 'test4'): {'day3': 'f'}})

最后,计算输出列表:

out = []
for e in d:
    out.append(
        list(e) + [d[e][day] if day in d[e] else '-' for day in days])
>>> out
[['reg1', 'test2', 'p', 'p', 'p'],
 ['reg1', 'test4', '-', 'f', '-'],
 ['reg1', 'test1', '-', '-', 'f'],
 ['reg1', 'test3', 'p', '-', '-']]

在CSV中输出这个应该很简单。你知道吗

相关问题 更多 >