【问题标题】:Remove BOTH items from list, if one value appears multiple times (Python)如果一个值多次出现,则从列表中删除两项(Python)
【发布时间】:2011-11-07 08:59:04
【问题描述】:

Python: How to remove all duplicate items from a list

大家好

我有一个 (file,inode,image,hash)-tuples 列表。如果它们具有相同的哈希值,我需要删除这两个项目。我没有那么多的编程经验,所以也许对我必须看的东西的提示已经很有帮助了。 我已经在互联网上搜索过,但我唯一找到的是this。 到目前为止,我已经想出了这个(非常尴尬)的解决方案:

        hashlist = {}
        files_tobe_removed = []
        for (file, inode, image, hash) in self.files_for_json:
            hashlist[hash] = 0
        for (file, inode, image, hash) in self.files_for_json:
            hashlist[hash] +=1
        for (k,v) in hashlist.iteritems():
            if v == 2:
                files_tobe_removed.append(k)
        for (file,inode,image,hash) in self.files_for_json:
            if hash in files_tobe_removed:
                path = self.outDir + file
                os.remove(path)
                self.files_for_json.remove((file,inode,image,hash))

任何帮助将不胜感激。提前致谢

【问题讨论】:

  • 您应该检查v>1 是否存在三个或更多相同的哈希值。当心哈希冲突

标签: python list duplicates


【解决方案1】:
>>> from collections import Counter
>>> L=[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,1,2,3]
>>> [k for k,v in Counter(L).items() if v==1]
[7, 8, 9]

澄清一下:

hash_counter = Counter(x[3] for x in self.files_for_json)
for (file,inode,image,hash) in self.files_for_json:
    if hash_counter[hash]>1:
        # duplicated hash
        ...

【讨论】:

  • 对于元组列表,它看起来不会那么优雅。 :-)
  • @DrTyrsa,你为什么要使用元组列表?当然,您只会使用哈希列表。
  • 所以你需要一次迭代来构造一个元组列表。第二次迭代用 Counter 计数它们。第三次迭代以删除元素。虽然它可以通过两次迭代来解决。
  • @DrTyrsa,我首先使用了 3 次迭代以使其更适合 OP 代码。现在我将其更改为仅使用 2 次迭代
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 2022-01-24
  • 1970-01-01
  • 2017-11-23
相关资源
最近更新 更多