输出有效,它可以完成我需要做的事情,但是还有更多的pythonic方式可以做到这一点吗? 我基本上是在尝试通过csv过滤并找到每个患者的唯一元素。
我必须以特定方式编写代码,以确保我的数据正确对齐而不会丢失格式。我只是想知道是否还有一种更Python化的方式来做到这一点?我什至会占用资源而不是代码。我只是想提高效率。我仍然是python新手,并且由于只能使用import csv,os和string的事实而受到限制。
我的行从第5行到第15行开始的原因是,对于该部分,我不需要1-4列中的任何内容。
我的代码如下:
diagnosiscounts = csv.reader(self.unique_diagnosis)
patID = []
cd1 = []
cd2 = []
cd3 = []
cd4 = []
cd5 = []
cd6 = []
cd7 = []
cd8 = []
cd9 = []
test = {}
diag = {}
hjj = {}
for row in diagnosiscounts:
patID.append(row[0])
cd1.append(row[5])
cd2.append(row[6])
cd3.append(row[7])
cd4.append(row[8])
cd5.append(row[9])
cd6.append(row[10])
cd7.append(row[11])
cd8.append(row[12])
cd9.append(row[13])
dg1 = tuple(zip(patID,cd1))
dg2 = tuple(zip(patID,cd2))
dg3 = tuple(zip(patID,cd3))
dg4 = tuple(zip(patID,cd4))
dg5 = tuple(zip(patID,cd5))
dg6 = tuple(zip(patID,cd6))
dg7 = tuple(zip(patID,cd7))
dg8 = tuple(zip(patID,cd8))
dg9 = tuple(zip(patID,cd9))
for k, v in dg1:
test.setdefault(k,[]).append(v)
for k, v in dg2:
test.setdefault(k,[]).append(v)
for k, v in dg3:
test.setdefault(k,[]).append(v)
for k, v in dg4:
test.setdefault(k,[]).append(v)
for k, v in dg5:
test.setdefault(k,[]).append(v)
for k, v in dg6:
test.setdefault(k,[]).append(v)
for k, v in dg7:
test.setdefault(k,[]).append(v)
for k, v in dg8:
test.setdefault(k,[]).append(v)
for k, v in dg9:
test.setdefault(k,[]).append(v)
for k, v in test.items():
tp = []
for i in v:
if i != '':
tp.append(i)
diag[k] = set(tp)
for k,v in diag.items():
hjj[k] = len(v)
print(hjj)
我的csv文件的结构如下:
Patient_ID ICD9_DGNS_CD_1 ICD9_DGNS_CD_2 ICD9_DGNS_CD_3 ICD9_DGNS_CD_4 ICD9_DGNS_CD_5 ICD9_DGNS_CD_6 ICD9_DGNS_CD_7 ICD9_DGNS_CD_8 ICD9_DGNS_CD_9 ICD9_DGNS_CD_10
00013D2EFD8E45D1 5.42192E+14 4824842417 V5841
00016F745862898F 5.42272E+14 2963419753 2963419753 V5832 V5861 2724 3182 V5869 42731
00016F745862898F 5.42282E+14 5737807753 5737807753 9594 E9174 4019
0001FDD721E223DC 5.42642E+14 1233847710 78943 V5866 V1272
00024B3D2352D2D0 5.42242E+14 9688809345 6009
00024B3D2352D2D0 5.42442E+14 4199631965 6115
00024B3D2352D2D0 5.42422E+14 1449018601 2723
00024B3D2352D2D0 5.42372E+14 5972737463 V821
0002F28CE057345B 5.42052E+14 546645 3255 4566 45974
0002F28CE057345B 5.42162E+14 7985077191 7902
0002F28CE057345B 5.42192E+14 420175516 7232
0002F28CE057345B 5.42342E+14 7535793863 25012 V5867
0002F28CE057345B 5.42472E+14 6022067668 59781
0002F28CE057345B 5.42892E+14 3482 3569 3320
对我来说,这不是很好的代码结构,我想使其更好。
答案 0 :(得分:0)
您可以列出要操作的对象,然后遍历那个列表并执行操作。如:
cd_list = [list() for _ in range(10)]
indices = [0, 5, 6, 7, 8, 9, 10, 11, 12, 13]
test = {}
diag = {}
hjj = {}
for row in diagnosiscounts:
for index, cd_obj in zip(indices, cd_list):
cd_obj.append(row[index])
dg_list = list(map(lambda cd_obj: tuple(patID, cd_obj), cd_list))
for dg_obj in dg_list:
for k, v in dg_obj:
test.setdefault(k, []).append(v)
在没有可以直接测试的对象的情况下,此应该有效,但是我不确定。
注意:作为一般规则,如果发现重复动作不止一次或两次,您的第一本能应考虑如何使用循环更有效地完成操作
答案 1 :(得分:0)
我认为您正在寻找的是一种更优雅的组合方式。
也许是这样的东西或组合:
from collections import defaultdict
diagnosiscounts = [
('00013D2EFD8E45D1', '5.42192E+14', '4824842417'),
('00016F745862898F', '5.42272E+14', '2963419753'),
]
data = defaultdict(list)
data_by_patient = {}
for row in diagnosiscounts:
for i, c in enumerate(('Patient_ID', 'ICD9_DGNS_CD_1', 'ICD9_DGNS_CD_2')):
data[c].append(row[i])
data_by_patient[row[0]] = row[1:]