【问题标题】:find symmetric pairs using hash table(dictionary) in python在python中使用哈希表(字典)查找对称对
【发布时间】:2019-10-18 04:03:42
【问题描述】:

我正在尝试获取没有重复的对称对,例如,来自

L=[(1,3), (2,6), (3,5), (4,7), (5,3), (6,2), (3,4),(4,3)]

,我想得到like[(2,6), (3,5), (3,4)],寻找对称对。

这是我的完整代码,

L=[(1,3), (2,6), (3,5), (4,7), (5,3), (6,2), (3,4),(4,3)]

def find_symmetric_pairs(L):
    temp = {}
    temp_list = []
    for i in L:
        key, value = i
        for j in L:
            key_j, value_j = j
            if key == value_j and value == key_j:
                temp_list.append(tuple((key,value)))
    return temp_list

另外,我正在尝试使用 python hashtable 来实现这个功能,我该如何使用 hashtable? 输出如下所示

[(2, 6), (3, 5), (5, 3), (6, 2), (3, 4), (4, 3)] 但我想显示上面我第一次告诉你的输出...... [(2,6), (3,5), (3,4)]

【问题讨论】:

  • 您想使用散列吗?为什么?你不需要一张桌子,你只需要一个set

标签: python list dictionary tuples hashtable


【解决方案1】:

您只需要添加一个检查以查看对称对是否已添加到您的结果中,

L=[(1,3), (2,6), (3,5), (4,7), (5,3), (6,2), (3,4),(4,3)]

res = set()

#Convert the list to a set
L = set(L)
# Iterate through the set
for t in L:
    # If the a tuple is present , and the reversed tuple is not in the result set already
    if (t[1], t[0]) in L and (t[1], t[0]) not in res:
        # Add it to result set
        res.add(t)

print(res)

输出将是

{(2, 6), (4, 3), (3, 5)}

另一种方法是重新排序元组,使第一个元素比第二个大,并通过collections.Counter 计算元组。计数为 2 的元素将是对称对

from collections import Counter

L=[(1,3), (2,6), (3,5), (4,7), (5,3), (6,2), (3,4),(4,3)]

#reorder tuple so that first element is bigger then second
L = [(t[1], t[0]) if t[0] < t[1] else t for t in L]

#Make a counter 
c = Counter(L)

#Count elements with count 2
res = [key for key, value in c.items() if value == 2]
print(res)

输出将是

[(6, 2), (5, 3), (4, 3)]

【讨论】:

    【解决方案2】:

    Python 中没有这样的哈希表,但您可以使用集合。下面将原始元组set(L) 与一组反转元组{(y, x) for x, y in L} 组合在一起。它稍后只保留具有较小第一个元素的对:

    pairs = set(L) & {(y, x) for x, y in L}
    {(x,y) for x,y in pairs if x < y}
    #{(2, 6), (3, 4), (3, 5)}
    

    【讨论】:

    • @Aran-Fey 首先,答案甚至都不正确。
    • "Python 中没有这样的哈希表" 我很确定 dict 是一个哈希表。
    • 实际上这确实有一个小错误(可能):如果输入中有任何像(1, 1) 这样的对称元组,即使它们只出现一次,它们也会包含在输出中。这是否真的是一个错误值得商榷,但无论如何都值得注意。
    • 哈希表的名称不会改变它们确实存在于 Python 中的事实。这似乎是一个非常具有误导性的陈述。
    • Python 的 dict 专门使用 hash 作为其键。因此,dictionary 可能是任何类型的映射,但 dict 是一个哈希表,或者至少在功能上无法区分(如果有人想将 PyPy 的 JIT 或策略拖入其中)。
    【解决方案3】:

    如果你想忽略顺序,你可以使用一个集合。具体来说,frozenset 将允许您进行哈希处理,因此可以使用 Counter

    from collections import Counter
    L_set_counter = Counter(map(frozenset, set(L)))
    

    现在L_set_counter 包含:

    Counter({frozenset({2, 6}): 2, frozenset({3, 5}): 2, frozenset({3, 4}): 2, frozenset({1, 3}): 1, frozenset({4, 7}): 1})
    

    并确实找到重复项(v==2 使其更具体,更通用):

    dups = {k for k, v in L_set_counter.items() if v > 1}
    

    现在dups 包含:

    {frozenset({3, 4}), frozenset({3, 5}), frozenset({2, 6})}
    

    【讨论】:

      猜你喜欢
      • 2014-02-20
      • 1970-01-01
      • 2023-04-02
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多