繁体   English   中英

Python循环:使它们更通用

[英]Python loops: Making them more general

我正在根据电子表格中的其他信息,将日期格式的数据转换为新的ID。 我还想根据同一天的后续事件添加_2,_3等。 因此,如果dateID中有3个个案20101212,则最后2个事件的ID上将修改_2和_3。

如何使我的解决方案更具通用性。 它可以工作,但不是很可重用。 据我所知,该特定电子表格目前仅是硬编码,任何特定日期都不超过3个案例。 如何在不继续添加其他elif语句的情况下编写代码以在同一天捕获3种以上事件的事件?

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']

一个简单的解决方案是循环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以获得更好的性能和可读代码。

在无法测试某些数据的情况下,请尝试以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM