我有一个包含主题的数组,每个主题都有连接时间。我想比较列表中的每个主题。如果有两个相同的科目,我想添加两个科目的时间,并且还想删除第二个科目信息(科目名称和时间)。
但如果我删除该项目,列表会变短,我会收到超出范围的错误。我尝试使用subjectlegth-1缩短列表,但这也行不通。
...
subjectlegth = 8
for x in range(subjectlength):
for y in range(subjectlength):
if subject[x] == subject[y]:
if x != y:
#add
time[x] = time[x] + time[y]
#delete
del time[y]
del subject[y]
subjectlength = subjectlength - 1
答案 0 :(得分:8)
如果可以的话,向后迭代:
for x in range(subjectlength - 1, -1, -1):
,同样适用于y
。
答案 1 :(得分:8)
如果subject
的元素可以播放:
finalinfo = {}
for s, t in zip(subject, time):
finalinfo[s] = finalinfo.get(s, 0) + t
这将导致带有subject: time
键值对的字典。
答案 2 :(得分:6)
最佳做法是创建要删除的条目的新列表,并在遍历列表后删除它们:
to_del = []
subjectlength = 8
for x in range(subjectlength):
for y in range(x):
if subject[x] == subject[y]:
#add
time[x] = time[x] + time[y]
to_del.append(y)
to_del.reverse()
for d in to_del:
del subject[d]
del time[d]
答案 3 :(得分:2)
另一种方法是重新创建主题和时间列表,使用dict来总结重复主题的时间(我假设主题是字符串,即可以播放)。
subjects=['math','english','necromancy','philosophy','english','latin','physics','latin']
time=[1,2,3,4,5,6,7,8]
tuples=zip(subjects,time)
my_dict={}
for subject,t in tuples:
try:
my_dict[subject]+=t
except KeyError:
my_dict[subject]=t
subjects,time=my_dict.keys(), my_dict.values()
print subjects,time
答案 4 :(得分:0)
虽然while
循环肯定是更好的选择,但如果你坚持使用for
循环,可以用无替换list
要删除的元素或任何其他可区分的项目,并在list
循环后重新定义for
。以下代码从整数列表中删除偶数元素:
nums = [1, 1, 5, 2, 10, 4, 4, 9, 3, 9]
for i in range(len(nums)):
# select the item that satisfies the condition
if nums[i] % 2 == 0:
# do_something_with_the(item)
nums[i] = None # Not needed anymore, so set it to None
# redefine the list and exclude the None items
nums = [item for item in nums if item is not None]
# num = [1, 1, 5, 9, 3, 9]
对于这篇文章中的问题:
...
for i in range(subjectlength - 1):
for j in range(i+1, subjectlength):
if subject[i] == subject[j]:
#add
time[i] += time[j]
# set to None instead of delete
time[j] = None
subject[j] = None
time = [item for item in time if item is not None]
subject = [item for item in subject if item is not None]