【问题标题】:getting the index while interating a list在迭代列表时获取索引
【发布时间】:2023-04-04 14:59:01
【问题描述】:

在交互列表时,如何获取当前项目的 id 以将其引用到列表方法?

xl = [1,2,3] # initial list
yl = [3,2]   # list used to remove items from initial list

for x in xl[:]:
    for y in yl:
        if x == y:
            xl.pop(x) # problem
            break
        print x, y
print xl

在简单的例子中,我想遍历 2 个列表,当我找到类似的项目时,将其从列表 1 中删除。

在用“#problem”注释的行中,我应该用什么代替 X?

PS:请注意这是我正在迭代的副本。

【问题讨论】:

    标签: python list loops


    【解决方案1】:

    不要删除你不喜欢的元素,你应该简单地使用filter

    x1 = filter(x1, lambda x: x not in y1)
    

    或者,list comprehension 也可以:

    x1 = [x for x in x1 if x not in y1]
    

    如果 y1 很大,你应该在一个集合中查找,像这样:

    y1set = set(y1)
    x1 = filter(x1, lambda x: x not in y1set)
    

    作为参考,pop 采用索引,获取索引的通用方法是 enumerate。但是,几乎在所有情况下,编写代码的方式都比使用索引更短、更简洁。

    【讨论】:

    • 这实际上是一个到数据库的映射。所以在这种情况下,我想保留索引。在我的业务逻辑中,当我从数据库中删除时,我将从内存列表中删除。认为我最终会使用与数据库匹配的显式索引...
    • @gcb 如果要保留索引,则不应使用pop,而是将x1 列表中的条目设置为某个标记值,例如None。跨度>
    • 我也想删除索引。
    • @gcb 好吧,那么只需使用filter。抱歉,但我不明白你为什么拼命想打电话给poppop 在设计上非常慢,因为它需要复制列表的大部分并可能在之后重新分配列表。
    • 我将它用作队列,所以它可能会慢一些,但最好的类比是当我稍后阅读时不要让代码太深奥:) 但我可能会回顾一下使用列表理解而不是队列。
    【解决方案2】:

    xl = [x for x in xl if x not in y]怎么样

    这被称为list comprehension

    【讨论】:

    • 这是一个“简单的例子”。它将需要 http 请求以及不进行检查的内容,而不仅仅是匹配两个数字。
    • @gcb 这不是问题。您可以使用xl = [x for x in xl if checkHttpRequestsAndWhatNot(x)] 或更短的x1 = filter(x1, checkHttpRequestsAndWhatNot) 尽可能多地检查。
    • 这是一个很好的观点......我想我会回顾一下我现在正在使用的结构。
    • 听起来好像您并没有真正提出您想要回答的问题。您可以更新问题以使其更准确。当您提出一个简单的问题时,您通常会发现有一个简单的答案可用。
    • 关于 enumerate 的答案正好回答了这个问题,但是你和 phihag 提出了一个很好的观点,即使用列表理解和一堆函数而不是一个标志和一堆循环。但我认为这与问题无关
    【解决方案3】:

    执行此操作的一般方法是使用enumerate

    for idx, item in enumerate(iterable):
      pass
    

    但是对于您的用例,这不是很 Pythonic 的方式来做您似乎正在尝试的事情。应避免遍历列表并同时对其进行修改。只需使用列表推导:

    xl = [item for item in xl if item not in yl]
    

    【讨论】:

    • +1 用于枚举,但为了澄清,可以在循环时修改列表,同时更改索引的值而不是列表的大小。尽管在副本上执行此操作是安全的,但可能效率不高。
    猜你喜欢
    • 2018-01-27
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多