Python循环:使它们更通用

Python循环:使它们更通用,python,loops,collections,Python,Loops,Collections,我正在根据电子表格中的其他信息将日期格式的数据转换为新ID。我还想根据当天的后续事件添加_2、_3等。因此,如果dateID中有3个20101212案例,那么最后2个事件将在ID上修改_2和_3 如何使我的解决方案更一般化。它可以工作,但不太可重用。它目前只是硬编码,正如我在这个特定的电子表格中所知道的,任何特定日期的案例不超过3个。如何编写代码,以便在不继续添加额外的elif语句的情况下捕获同一天发生的超过3个案例的事件 dateID = [some list of strings in da

我正在根据电子表格中的其他信息将日期格式的数据转换为新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']
dateID=[日期格式的字符串列表]
GS=[要附加到相应日期的2个字母字符串的一些列表]
#len(GS)=len(日期ID)
caseID=[]
y=集合.计数器(日期ID)
#len(y)
如果无法针对某些数据进行测试,请尝试以下操作:

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
dateID=[日期格式的字符串列表]
GS=[要附加到相应日期的2个字母字符串的一些列表]
#len(GS)=len(日期ID)
caseID=[]
y=集合.计数器(日期ID)
#len(y)
一个简单的解决方案是循环次数与
num\u 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

请注意,仅当您希望以相同的格式继续时,此操作才起作用。我还将
排序(y.iteritems())[I][0]
重构为
base\u string
,以获得更好的性能和可读性。

您正在覆盖全局变量
j
,这将打乱asker代码的列表索引系统
GS
。它仍然不正确,
j
用于访问
GS
中的下一个元素。您的代码只重复检索
GS
中的第一个
num\u iter
值。谢谢,下次我应该多加小心。。。我认为现在应该是正确的。是的。不用担心,我们所有人在没有IDE和/或无法调试的情况下编码时都会遇到问题,特别是当它不是我们的代码时:)谢谢您的帮助。我一直在研究你的答案,试图完全理解它。它工作得很好,教会了我很多!也谢谢你。我现在明白了,您的解决方案是让我在这个循环的基础上再添加一个循环。一开始,python式的代码编写方式让我感到困惑,因为我的编码步骤仍然太多。