如何在python中打印唯一的行

时间:2015-02-12 19:43:29

标签: python

我从oracle db中提取数据,需要在标准输出中打印唯一值:

我的数据是这样的:

server1.CRITICAL_INCIDENTS 1418223897 0.000000 host=server1 type=oracle_database source=Oracle dc=DC1
server1.ResponseTimepertransaction 1418223577 2.467900 host=server1 type=oracle_database source=Oracle dc=DC1
server1.DataDictionaryHitPercent 1418223577 100.000000 host=server1 type=oracle_database source=Oracle dc=DC1
server1.FullIndexScanspersecond 1418223577 0.000000 host=server1 type=oracle_database source=Oracle dc=DC1
server1.ExecutesPerformedwithoutParsesPercent 1418223577 66.666667 host=server1 type=oracle_database source=Oracle dc=DC1
server1.SortsinMemoryPercent 1418223577 100.000000 host=server1 type=oracle_database source=Oracle dc=DC1
server1.BufferCacheHitPercent 1418223577 100.000000 host=server1 type=oracle_database source=Oracle dc=DC1
server1.DatabaseCPUTimePercent 1418223577 81.048665 host=server1 type=oracle_database source=Oracle dc=DC1
server1.CRITICAL_INCIDENTS 1418223897 0.000000 host=server1 type=oracle_database source=Oracle dc=DC1
server1.CRITICAL_INCIDENTS 1418223897 0.2000000 host=server1 type=oracle_database source=Oracle dc=DC1
server1.ResponseTimepertransaction 1418223577 2.467900 host=server1 type=oracle_database source=Oracle dc=DC1

当我打印此值时,我只需要打印唯一值。来自Oracle的数据是日期格式,当我将其转换为纪元时,我可能会为同一指标同时获得重复值。如果时间戳和公制的值相同,我只需要打印其中一个。

例如,我只需要打印其中一行。它们具有相同的时间(1418223897)和相同的度量标准(server1.CRITICAL_INCIDENTS)。值不同,一个是0.0000000和0.2000000,但可以有不同的值。

server1.CRITICAL_INCIDENTS 1418223897 0.000000 host=server1 type=oracle_database source=Oracle dc=DC1
    server1.CRITICAL_INCIDENTS 1418223897 0.2000000 host=server1 type=oracle_database source=Oracle dc=DC1

我试过了:

import pyodbc
import re
sql="DateTime, Server, Server_Type, Metric, Value from oracle_table"

cnxn = pyodbc.connect("DSN=dsn1;UID=userid;PWD=passwd123")

cursor = cnxn.cursor()


cursor.execute(sql)
row = cursor.fetchall()

    seenAlready = set()
    for line in row:
        if line[4]:
            if float(line[4])>=0:
                outputLine = line[0],line[1],line[2],line[3],line[4]
                outputLine1=line[0],line[3] #DateTime and Metric

                if outputLine1 in seenAlready:
                            continue
                    else:
                            print ' '.join([str(i) for i in outputLine])
                            seenAlready.add(outputLine1)

这不太合适,因为即使Tought DateTime和Metric相同,每一行也可能是唯一的,因为我的价值不同。

如何修复它以便我只为相同的DateTime和Metric行打印一行?

1 个答案:

答案 0 :(得分:1)

如果您收集所有数据并将其放入一个集合(或将每个列放入其自己的集合中),那么您将永远不会有重复项,因为集合只能包含唯一项目。如果某个值与另一个值完全相同,那么如果您尝试将其添加到集合中,则应该忽略它。之后,您可以使用打印功能循环浏览该组。

seenAlready = set()
for line in row:
    if line[4]:
        if float(line[4])>=0:
            outputLine = line[0],line[1],line[2],line[3],line[4]
            outputLine1=line[0],line[3] #DateTime and Metric

            seenAlready.add(outputLine1)

for line in seenAlready:
    print(line) #or whatever formatted value you need to print

这样的东西,或者同样的思维方式。从集合中打印最有意义,因为您可以保证拥有一组独特的项目。

相关问题