首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果要删除项,如何使用“for x in list”

如果要删除项,如何使用“for x in list”
EN

Stack Overflow用户
提问于 2017-11-21 18:50:31
回答 1查看 61关注 0票数 1

我正在用python编写一个文本冒险代码。我有一个治安官NPC,它对player.inventory中的所有item.name == "dead goblin"对象进行计数,如果item.name == "dead goblin",则该项将从列表中删除,并从goblins_taken += 1中删除

代码语言:javascript
复制
    if "sheriff" in player.action and "talk" in player.action and player.location == sheriff:
        goblins_taken = 0
        for item in player.inventory:
            if item.name == "dead goblin":
                goblins_taken += 1
                player.inventory.remove(item)
        write("The sheriff says, 'Good job. You have killed " + str(goblins_taken) + " goblins!")

这个代码的问题在于,如果玩家杀死了两个妖精,治安官会说玩家杀死了一个妖精,而不是两个。

我试图简化空闲中的问题,并意识到这是一个索引问题:

代码语言:javascript
复制
>>> foo = ['a', 'b', 'c', 'd', 'e']
>>> foo[2]
'c' # With b
>>> foo.remove('b')
>>> foo[2]
'd' # Without b, index is shifted down

是否有比list.remove()更好的从列表中删除项的方法?还是有办法解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-21 18:53:28

您不应该修改您正在迭代的列表!您可以通过创建第二个列表来解决这个问题:

代码语言:javascript
复制
temp_inventory = list(player.inventory)
for item in player.inventory:
    if item.name == "dead goblin":
        goblins_taken += 1
        temp_inventory.remove(item)
player.inventory = temp_inventory

这是我尝试过的,也成功了:

代码语言:javascript
复制
a = [1,2,3,2,1]
b = list(a)
elems_removed = 0
for elem in a:
    if elem == 2:
        elems_removed += 1
        b.remove(elem)
print(a)
print(b)
a=b
print(a)
print(elems_removed)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47420544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档