Python“不在”索引超出范围en

2024-04-25 04:38:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一些问题,我找不到任何解决办法。 我的问题是,如果嵌套列表中的某个值不在另一个列表中,则控制该值;如果该值不在另一个列表中,则将其删除,但在“不在”行中,则会出现类似索引超出范围的错误。在

def heroes_updater(men_pref,women):
   for i in range(0,len(men_pref)-1):
      for j in range(0,len(men_pref[i])-1):
          if men_pref[i][j] not in women:
              men_pref[i]=men_pref[i][:j]+men_pref[i][j+1:]

男士优先:

^{pr2}$

女性榜样:

['Jean Grey', 'Elektra', 'Mystique', 'Ms. Marvel', 'Rouge']

错误是:

if men_pref[i][j] not in women:

IndexError: list index out of range


Tags: in列表forlenifdef错误not
3条回答

通过从列表中删除元素,列表变得更短j大于列表的长度。为了避免这个问题,不要修改列表,而是创建一个新列表:

def heroes_updater(men_pref,women):
   result = []
   for prefs in men_pref:
      new_prefs = []
      for pref in prefs:
          if pref in women:
              new_prefs.append(pref)
      result.append(new_prefs)
   men_pref[:] = result

或更好:

^{pr2}$

你在编辑你正在阅读的列表,千万不要这样做。在

使用men_pref[i]=men_pref[i][:j]+men_pref[i][j+1:]
您正在从列表men_pref[i]中删除一个项目,但是您的j变量从0变为列表的原始长度,因此当您检查men_pref[i][j]ifj>len(men_pref[i])时,最终会出现索引错误

编辑: 如果你想编辑你当前的列表,那么你必须用一个向后的索引来阅读它(你从最后一个开始,如果它不在女性列表中,你可以删除它,然后继续下一个项目):

def heroes_updater(men_pref,women):
    for i in range(len(men_pref)-1, -1,-1):
        for j in range(len(men_pref[i])-1, -1, -1):
            if men_pref[i][j] not in women:
                men_pref[i].pop(j)
                # An alternative: del(mem_pref[i][j])

另一种方法是使用列表理解:

^{pr2}$

还有其他的选择,但我把这个留给你。 你就是这样学的。在

您可以使用具有list comp的集合,不能迭代和变异列表,因为每次删除元素时,列表都会变小,并且索引基于开始范围时列表的大小:

men = [['Storm', 'Black Widow', 'Scarlet Witch', 'Rouge', 'Mystique', 'Jean Grey', 'Ms. Marvel', 'Gamora', 'Invisible Woman', 'Elektra'], ['Storm', 'Elektra', 'Jean Grey', 'Scarlet Witch', 'Mystique', 'Ms. Marvel', 'Gamora', 'Rouge', 'Black Widow', 'Invisible Woman'], ['Invisible Woman', 'Scarlet Witch', 'Mystique', 'Black Widow', 'Ms. Marvel', 'Elektra', 'Jean Grey', 'Gamora', 'Storm', 'Rouge']]

wom = {'Jean Grey', 'Elektra', 'Mystique', 'Ms. Marvel', 'Rouge'}

men[:] = [[ele for ele in sub if ele in wom] for sub in men]

print(men)

或者功能上,如果顺序无关:

^{pr2}$

您也可以从列表的末尾开始,使用范围逻辑,但是使用range(len(sub)-1,-1, -1),但是只使用reversed并迭代元素本身会更容易:

^{3}$

相关问题 更多 >