gpt4 book ai didi

python,存储重复条目的智能方法

转载 作者:行者123 更新时间:2023-12-01 03:40:03 25 4
gpt4 key购买 nike

我的日志文件包含各种垃圾以及有用的数据。我通过匹配某些模式来提取一些信息,并能够在 python 中逐行读取文件并应用一些 if 语句时获得以下格式

job id: job#33ABC
Bin 1:30.86
Bin2: 30.86

job id: job#44BC
Bin1: 27.22
Bin2: 8.53
Bin3: 35.75

job id: job#65A
Bin2: 17.135075
Bin4: 17.135120

job id: job#P17
Bin 3: 7.328211
Bin 4: 15.918724

现在的问题是相同的日志集使用相同的作业 ID(具有不同的值)重复

job id: job#33ABC
Bin1: 99
Bin2: 1099
...
...

...

如果有某种聪明的方式以表格格式写入文件/csv,这样只需查看 job_id,它就会显示每组的所有 Bin1、Bin2 作业,现在基本上是大量重复,相同的作业来了再次使用一组不同的值,例如 job#33ABC,使用不同的值继续出现 10,11 次

job_id        bin 1, bin2, bin3,bin4   
set#1 set #2 set #3
job#33ABC 30.86, 30.86, 0, 0 30.86, 30.86, 0,0
job#44BC 27.22, 8.53, 35.75, 0 0,0,0,34.56
....
...

我正在逐行阅读该日志

  for line in input_file:
if job_name in line:
<extract job_name logic>
print job_name[0]
if 'bin1 matches'
bin1[0]=<all logic>
print "bin1",
bin1[0]
..
...

更新我尝试使用类似的字典

records{}
for line in input_file:
if job_name in line:
<extract job_name logic>
print job_name[0]

if 'bin1 matches'
bin1[0]=<all logic>
print "bin1",
bin1[0]
records[job_name[0]]=records.get(job_name[0],[])+[bin1[0]]

if 'bin2 matches'
...
..
records[job_name[0]]=records.get(job_name[0],[])+[bin2[0]]

for key, value in records.items():
writer.writerow([key, value])

但它以以下格式呈现;

    33ABC, " ['30.86','30.86','99.0','1099' ]

我的问题是我如何识别并呈现 33ABC, "['30.86','30.86',,'99.0','1099',, ] 由于必须有 4 个作业箱,所以现在它将所有值作为一个大列表,而不是分成 4 个, 4 个垃圾箱或者有什么方法可以按照当前的逻辑做到这一点?

最佳答案

抛开IO问题,你可以使用defaultdict方便物流。或者准确地说,是 defaultdictdefaultdict

您的外部字典可以具有与作业名称相对应的键。每个作业名称的值本身就是一个字典,其键对应于 bin 名称。因此,对于每个作业名称和键名称,您尝试将一个元素附加到内部字典的值中。如果此时垃圾箱已出现,则会附加该值。如果 bin 是新的,则使用默认的空列表,并附加第一个值(仅需要 defaultdict 以避免一直测试现有键):

from collections import defaultdict
logs = defaultdict(lambda: defaultdict(list))

# simulate the following input stream:
#
# job1:
# bin1: val1
# bin1: val2
# bin2: val3
#
# job2:
# bin2: val4
#
# job1:
# bin1: val5

logs['job1']['bin1'].append('val1')
logs['job1']['bin1'].append('val2')
logs['job1']['bin2'].append('val3')
logs['job2']['bin2'].append('val4')
logs['job1']['bin1'].append('val5')

# see what we've got, converted to a non-default dict for prettiness
print({k:dict(logs[k]) for k in logs})

这将返回

{'job1': {'bin1': ['val1', 'val2', 'val5'], 'bin2': ['val3']}, 'job2': {'bin2': ['val4']}}

您可以看到值是跨作业和容器名称收集的。您可以根据自己的喜好进行写作,但我认为 CSV 在这种情况下没有意义。您可能必须使用自己的打印机。

您只需首先循环遍历日志,这将为您提供唯一的作业名称(键),然后循环遍历给定作业的每个容器,然后打印值列表:

for lkey in logs:
# lkey is a job name, logs[lkey] is a defaultdict
print(lkey)
for bkey in logs[lkey]:
# logs[lkey][bkey] is a list of values which you can print
print(bkey)
print(logs[lkey][bkey])

上面的输出是

job1
bin1
['val1', 'val2', 'val5']
bin2
['val3']
job2
bin2
['val4']

这正是我们所期望的。

关于python,存储重复条目的智能方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39734944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com