【问题标题】:Find Symmetric pairs in python在python中查找对称对
【发布时间】:2016-04-20 02:58:41
【问题描述】:

我有以下代码可以从给定的输入中查找和打印所有对称对。

'''
 Given a list of number pairs.
 If pair(i,j) exist, and pair(j,i) exist report all such pairs.
'''

def find_all_symmetric_pairs(inp_dic):

    for key in inp_dic:
        val = inp_dic[key]

        if inp_dic[val] == key:
            return key,val
    return -1,-1


inp_dic = {'1':'3','2':'6','3':'5','7':'4','5':'3','8':'7'}

print type(inp_dic)
key,value = find_all_symmetric_pairs(inp_dic)

print "key:"+str(key)
print "value:"+str(value)

输出:

 key:3
 value:5

但是如果我将输入更改为

inp_dic = {(1,3),(2,6),(3,5),(7,4),(5,3),(8,7)}

inp_dic = {{1,3},{2,6},{3,5},{7,4},{5,3},{8,7}}

我很难迭代。我怎样才能达到同样的效果?

【问题讨论】:

  • 显示你的错误。它几乎可以准确地告诉您问题所在。
  • or 之后的输入不是有效的 Python。这基本上是一组集合,这是不可能的(不可散列的)并且没有意义(过滤掉重复项)。

标签: python list iteration tuples python-2.x


【解决方案1】:

这似乎是一个有用的解决方案:

d = {'1':'3','2':'6','3':'5','7':'4','5':'3','8':'7'}
pairs = [(key, value) for key, value in d.items()]
answer = [(x, y) for (x, y) in pairs if (y, x) in pairs]
print(answer)

输出

[('3', '5'), ('5', '3')]

如果我们将pairs 设为set 而不是list,也可能会更快:

d = {'1':'3','2':'6','3':'5','7':'4','5':'3','8':'7'}
pairs = {(key, value) for key, value in d.items()}
answer = [(x, y) for (x, y) in pairs if (y, x) in pairs]
print(answer)

输出

[('3', '5'), ('5', '3')]

【讨论】:

  • 谢谢!非常优雅的解决方案
  • pairs 设为set 可能会更快一些,而使用[(x, y) for (x, y) in pairs if (y, x) in pairs] 会更优雅(在我看来)
  • @tobias_k 感谢您的提示 - 我已更新我的答案以反映您的评论。
【解决方案2】:

使用生成器https://wiki.python.org/moin/Generators

def find_all_symmetric_pairs(inp_dic):

    for key in inp_dic:
        val = inp_dic[key]

        if inp_dic[val] == key:
            yield key,val

【讨论】:

  • 这并没有解决我仍然遇到的问题,“TypeError: unhashable type: 'set'”
  • @KurinchiMalar 您不能将集合放在集合中,因为它们不可散列。你可以使用frozensets,但这也行不通,因为集合没有顺序,所以 {1,3} 和 {3,1} 是相同的,并且由于集合没有重复,第二个会在之前被丢弃你可以运行你的方法。
【解决方案3】:

好吧,对于一个人来说,您正在将 inp_dic 的类型更改为一组元组或一组集合 - 这显然不应该工作,因为集合是不可散列的:

>>> input_set = {{1,3}, {3,3}}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

但您可以像这样遍历元组集:

input_set = {(1,3), (42,23)}
for a, b in input_set:
    print(a, b)

【讨论】:

    【解决方案4】:

    您的函数find_all_symmetric_pairs 实际上只找到一个对称对。你可以把它变成一个真正迭代所有键的生成器函数:

    def find_all_symmetric_pairs(inp_dic):
    
        for key in inp_dic:
            val = inp_dic[key]
    
            if inp_dic[val] == key:
                yield key,val
        return -1,-1
    
    for key, val in find_all_symmetric_pairs(inp_dic):
        print "key: " + str(key)
        print "value: " + str(val)
    

    或者您可以通过附加到列表来手动生成:

    def find_all_symmetric_pairs(inp_dic):
        keys = []
        vals = []
        for key in inp_dic:
            val = inp_dic[key]
    
            if inp_dic[val] == key:
                keys.append(key)
                vals.append(val)
        return keys, vals
    
    for key, val in zip(*find_all_symmetric_pairs(inp_dic)):
        print "key: " + str(key)
        print "value: " + str(val)
    

    请记住,inp_dic = {(1,3),(2,6),(3,5),(7,4),(5,3),(8,7)} 创建一组元组,而 inp_dic = {{1,3},{2,6},{3,5},{7,4},{5,3},{8,7}} 尝试创建一组集合,这是非法的,因为集合是可变的,因此不可散列。第一种情况需要比仅使用字典更复杂的迭代,因为您必须在所有元组中搜索匹配的键或值。为了解决这个问题,您可以使用字典理解轻松转换为字典:

    inp_dic = {(1,3),(2,6),(3,5),(7,4),(5,3),(8,7)}
    inp_dic = {x[0]: x[1] for x in inp_dic}
    

    【讨论】:

    • @KurinchiMalar,您知道您可以随时更改选择的答案,只要找到更好的答案。只是说...
    【解决方案5】:

    我通过以下方式解决了这个问题。因此回答我自己的问题。

    def find_all_symmetric_pairs(inp_dic):
    
        for key in inp_dic.iterkeys():
            val = inp_dic.get(key)
    
            if inp_dic.get(val) == key:
                yield key,val
        return 
    
    
    inp_dic = [(1,3),(2,6),(3,5),(7,4),(5,3),(8,7)]
    
    inp_dic = dict(inp_dic)
    
    for key, val in find_all_symmetric_pairs(inp_dic):
    print "key: " + str(key)
    print "value: " + str(val)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-17
      • 2019-10-18
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 2011-07-04
      相关资源
      最近更新 更多