Python循环:使它们更通用

时间:2016-07-06 16:47:49

标签: python loops collections

我正在根据电子表格中的其他信息将日期格式的数据转换为新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']

2 个答案:

答案 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