我正在根据电子表格中的其他信息将日期格式的数据转换为新ID。我想在同一天根据后续事件添加_2,_3等。因此,如果dateID中存在3个20101212个案例,则最后2个事件将在ID上修改_2和_3。
如何让我的解决方案更加通用。它有效,但不是很可重复使用。它目前只是硬编码,因为我知道在这个特定的电子表格中,任何具体日期不超过3个案例。如何编写代码以便在同一天捕获超过3个案例的事件,而无需继续添加额外的elif语句?
dateID = [some list of strings in date format]
GS = [some list of 2 letter strings to append to corresponding dates]
#len(GS) = len(dateID)
caseID = []
y = collections.Counter(dateID)
#len(y) < len(dateID)
j = 0
for i in range(len(y)):
num_iter = sorted(y.iteritems())[i][1]
if num_iter == 1:
case = sorted(y.iteritems())[i][0] + GS[j]
caseID.append(case)
j = j + 1
elif num_iter == 2:
case = sorted(y.iteritems())[i][0] + GS[j]
caseID.append(case)
j = j + 1
case = sorted(y.iteritems())[i][0] + GS[j] + '_2'
caseID.append(case)
j = j + 1
elif num_iter == 3:
case = sorted(y.iteritems())[i][0] + GS[j]
caseID.append(case)
j = j + 1
case = sorted(y.iteritems())[i][0] + GS[j] + '_2'
caseID.append(case)
j = j + 1
case = sorted(y.iteritems())[i][0] + GS[j] + '_3'
caseID.append(case)
j = j + 1
else:
caseID.append('This catchs errors, add more elif num_iter == __')
dateID = ['19820323','19831209','19840218','19840321','19840504','19841227','19841227','19850104','19850110','19850114']
GS = [u'Er', u'Er', u'Er', u'Er', u'Er', u'Mn', u'Mn', u'Er', u'Er', u'Er']
答案 0 :(得分:2)
一个简单的解决方案是循环次数num_iter
。像
base_string = sorted(y.iteritems())[i][0]
for iter in range(num_iter):
case = base_string + GS[j]
case += '_{0}'.format(iter + 1) if iter > 0 else ''
caseID.append(case)
j += 1
请注意,这仅适用于您希望以相同格式继续的情况。我还将sorted(y.iteritems())[i][0]
重构为base_string
以获得更好的性能和可读的代码。
答案 1 :(得分:1)
无法测试某些数据,请尝试以下操作:
dateID = [some list of strings in date format]
GS = [some list of 2 letter strings to append to corresponding dates]
#len(GS) = len(dateID)
caseID = []
y = collections.Counter(dateID)
#len(y) < len(dateID)
j = 0
for i in range(len(y)):
num_iter = sorted(y.iteritems())[i][1]
for k in range(num_iter):
append_string = '_' + str(k + 1) if k != 0 else ""
case = sorted(y.iteritems())[i][0] + GS[j] + append_string
caseID.append(case)
j += 1