【问题标题】:Python removing 'duplicate' tuples from dictionaryPython从字典中删除“重复”元组
【发布时间】:2019-03-21 08:47:22
【问题描述】:

我有这本以元组为键的字典。所有这些元组都有两个值,我将使用字母作为值来保持简单,例如元组 (a, b)。

这两个值的顺序无关紧要,这意味着 (a, b) 本质上与 (b, a) 相同(或有点重复)。所以我试图写一些东西来删除所有这些冗余的键值对,但它不起作用,我严重坚持下去。我确信这只是我忽略的一些简单的事情,尽管我无法弄清楚。

我认为这会起作用:

def undupe_overlaps(overlaps):
    dupes = []
    for key, item in overlaps.items():
        if (key[1], key[0]) in overlaps:
            dupes.append((key[1], key[0]))
    for item in dupes:
    overlaps.pop(item)
    return overlaps

overlaps 是字典,我使用 list dupes 因为你不能从字典中删除东西并同时循环它。任何帮助或提示将不胜感激:)

【问题讨论】:

  • 也许 sort 元组元素?
  • 在这种情况下,您应该使用frozensets而不是元组作为键,您将免费获得此属性。

标签: python python-3.x dictionary tuples


【解决方案1】:

您的if 声明是错误的。应该是:

if (key[1], key[0]) not in dupes:
        dupes.append(key)

基本上,您是在询问当前键(元素反转)尚未出现在 dupes 列表中。

您的代码不起作用,因为您正在查看重叠,如果存在倒置的密钥,则插入当前密钥。这样,“单个”键,即没有对应键的键,永远不会插入 dupers

【讨论】:

  • 我更改了 if 语句,但仍有骗子存在
【解决方案2】:

您可以将键与字典分开转换为列表,然后在遍历键时修改字典。

def undupe_overlaps(overlaps):
    dupes = set()
    for key_tuple in list(overlaps.keys()):
        if key_tuple in dupes or (key_tuple[1], key_tuple[0]) in dupes:
            overlaps.pop(key_tuple)
        dupes.add(key_tuple)
    return overlaps

【讨论】:

  • 不应该和?如果不存在重复项,我不想删除 key_tuple
  • 没有。左边 (key_tuple in dupes) 应该总是返回 False,所以只有右边 ((key_tuple[1], key_tuple[0]) in dupes) 有任何效果。我只是将它包括在内以帮助显示这里的逻辑。如果将其更改为and,则该语句将永远不会返回 True。
  • 刚刚测试了它,它 100% 有效,所以感谢您的帮助:) 我会更多地检查它,以便更好地理解它! (我仍然认为自己是新手)
猜你喜欢
  • 2021-03-09
  • 2020-03-03
  • 2011-10-28
  • 2016-06-11
  • 2021-12-22
  • 2019-09-26
  • 1970-01-01
  • 2018-04-14
  • 2019-01-09
相关资源
最近更新 更多