找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3876|回复: 4

[求助] 关于for循环对列表元素删除操作的问题

2

主题

2

帖子

2

积分

贫民

积分
2
narmisk 发表于 2019-6-17 10:59:32 | 显示全部楼层 |阅读模式
4威望
感谢各位点进来。
目标希望用方法对列表中某符合条件的对象进行删除操作,
以下两种for循环中,对下标进行循环的for循环可以成功删除,但对列表中元素进行循环则无法成功删除。
希望论坛各位不吝赐教,谢谢!


class Enemy:
    def __init__(self, name, health, attack, defence):
        self.name = name
        self.health = health
        self.attack = attack
        self.defence = defence


list_enemies = [
  Enemy("灭霸", 0, 0, 0),
  Enemy("灭灭", 10, 10, 10),
  Enemy("霸霸", 1000, 1000, 1000),
  Enemy("霸灭", 10000, 10000, 10000)



# 删除列表数据中,最后一个数字参数 < 10 的数据\
def del04():
# 为什么这种for循环无法删除掉数据
 global list_enemies
   list_enemies_copy = list_enemies[::-1]
   for item in list_enemies_copy:
        if item.defence < 10:
            del item\
    list_enemies = list_enemies_copy[::-1]

# 而这种for循环却可以删除掉呢?
  for i in range(-1, -len(list_enemies)-1, -1):
        if list_enemies.defence < 10:
            del list_enemies


del04()
for item_result in list_enemies:
    print(item_result.name)

回复

使用道具 举报

1

主题

6

帖子

6

积分

贫民

积分
6
pikefreeman 发表于 2019-6-18 13:12:46 | 显示全部楼层
我不是很理解你为什么要设置一个copy列表
回复

使用道具 举报

1

主题

6

帖子

6

积分

贫民

积分
6
pikefreeman 发表于 2019-6-18 13:38:29 | 显示全部楼层
删除列表元素的话,我建议不要用del 因为del 函数删除的只是变量的引用,没有删除数据本身。还有一点就是不要尝试在for循环中尝试对所循环的对象本身进行删除操作,这样绝对会出错。可以使用remove函数
  1. def del04():
  2.     global list_enemies
  3.     list_enemies_copy = list_enemies[::-1]
  4.     for item in list_enemies_copy:
  5.         if item.defence < 10:
  6.             list_enemies.remove(item)
复制代码
回复

使用道具 举报

6

主题

30

帖子

30

积分

贫民

积分
30
你的一_LtH95 发表于 2019-6-23 19:00:00 | 显示全部楼层
class Enemy:
    def __init__ (self, name, health, attack, defence):
        self.name = name
        self.health = health
        self.attack = attack
        self.defence = defence


list_enemies = [
    Enemy("灭霸", 0, 0, 0),
    Enemy("灭灭", 10, 10, 10),
    Enemy("霸霸", 1000, 1000, 1000),
    Enemy("霸灭", 10000, 10000, 10000)]


def del04 ():
    global list_enemies
    """
    # 第一种
    list_enemies_copy = list_enemies[::-1]
    for item in list_enemies_copy:
        if item.defence < 10:
            # 这是因为你新遍历的列表,你操作的是list_enemies_copy这个值
            del item
            # item是对象名,就是list_enemies移除这个对象
            list_enemies.remove(item)
    """
    # 第一种
    for i in range(-1, -len(list_enemies) - 1, -1):
        if list_enemies[i].defence < 10:
            del list_enemies[i]


if __name__ == '__main__':
    del04()
    for item_result in list_enemies:
        print(item_result.name)
回复

使用道具 举报

6

主题

30

帖子

30

积分

贫民

积分
30
你的一_LtH95 发表于 2019-6-23 19:03:06 | 显示全部楼层
两处错误,可管理员帮你删了一点吧,
中括号没有对配


        if list_enemies[i].defence < 10:
            del list_enemies[i]
帮你加了[i]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表