Python循环:使它们更通用
我正在根据电子表格中的其他信息将日期格式的数据转换为新ID。我还想根据当天的后续事件添加_2、_3等。因此,如果dateID中有3个20101212案例,那么最后2个事件将在ID上修改_2和_3 如何使我的解决方案更一般化。它可以工作,但不太可重用。它目前只是硬编码,正如我在这个特定的电子表格中所知道的,任何特定日期的案例不超过3个。如何编写代码,以便在不继续添加额外的elif语句的情况下捕获同一天发生的超过3个案例的事件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
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式的代码编写方式让我感到困惑,因为我的编码步骤仍然太多。