【问题标题】:In-place set element removal in multiple sets during iteration迭代期间在多个集合中就地移除集合元素
【发布时间】:2014-08-13 17:01:17
【问题描述】:

我有两组对象,s1 和 s2,它们的长度不同。我想根据这个伪代码就地修改这两组:

for a1 in s1:
  for a2 in s2:
    if a1.name == a2.name:
      # insert some stuff into database
      # remove a2 from s2 and a1 from s1

s1 和 s2 现在只有 s1[n].name != s2[n].name 的元素。当然,从集合中删除项目应该不会影响正在进行的迭代的其余部分。

我意识到解决这个问题的方法不止一种。我正在努力想出一种“python 风格”的方式(即不使用嵌套的 for 循环):map?筛选?拉姆达?列表理解?算法性能并不是特别重要,因为集合非常小——每个元素不超过 100 个,但通常每个元素大约 10 个。

【问题讨论】:

  • 考虑到它们的大小,为什么要就地修改集合?
  • 我推荐使用第三组,因为修改你正在迭代的集合是危险的——你不会在开车的时候换轮子,对吗?
  • 事实证明,使用新的 set() 执行此操作太复杂了,因为我需要保留 a1.name != a2.name 且不重复的元素。

标签: python map filter lambda list-comprehension


【解决方案1】:

更新

我重新考虑了这一点。对于就地:

for a1 in s1:
    for a2 in s2:
        if a1.name == a2.name:
            s1.remove(a1)
            s2.remove(a1)

还有一种更“python 风格”的方式:

s1_filtered = [r for r in s1 if r not in s2]
s2_filtered = [r for r in s2 if r not in s1]

上一个

只要做——

for a1 in s1:
  for a2 in s2:
    if a1.name == a2.name:
        del a1 #you get an error
        del a2 #you get an error
        # insert some stuff into database
        # remove a2 from s2 and a1 from s1

【讨论】:

  • 第一次删除 a1 和 a2 后,我得到这个错误: if a2.name == a1.name: UnboundLocalError: local variable 'a1' referenced before assignment
【解决方案2】:

由于我没有 50 个代表来评论代码,所以我会像常规答案一样写:

for a1 in s1:
  for a2 in s2:
    if a1.name == a2.name: # since a1 may have been deleted while iterating through s2 .name is essentailly called on null and thats where you get UnboundLocalError: local variable 'a1' referenced before assignment.
        del a1 #you get an error because a1 was previously deleted 
        del a2 #you get an error

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 2021-10-15
    • 2012-05-13
    相关资源
    最近更新 更多