元组作为字典键,顺序可能并不总是很重要

Tuples as dict keys where order may not always matter

我有一本使用元组作为键的字典。键指的是图上两个节点之间的边,例如。 “vendor 连接到 account”,关联值是连接的强度,因此 ('vendor','account'): 7。我需要能够通过两种方式从字典中获取值:a)通过传入元组中元素顺序很重要的键 b)元组的顺序是 not 重要。不同之处在于,有时连接的方向很重要,有时则无关紧要。 (在图形方面,有时我认为图形是有向的,有时是无向的。)请注意,没有重复的元组对,例如。 (vendor,account) - (account,vendor) 这样事情就简单多了。

我想到了一种接受元组并将其与正确的键匹配而不考虑顺序的方法。不幸的是,这意味着每次都要遍历所有的键。我只是想知道是否有更好的方法?

v_dict = {('vendor', 'account'):1,
        ('vendor', 'cost_center'):2,
        ('vendor', 'purchase_order'):3,
        ('vendor', 'user_name'):5,
        ('vendor', 'invoice'):6}

pair = [('purchase_order', 'vendor'), ('invoice','vendor'), ('vendor', 'user_name')]

key = []

[key.append(j) for j in v_dict.keys() for i in pair if i[0] in j and i[1] in j]

for key in key:
    print(key, v_dict[key])

注意:我知道并使用专用图形库。在这种情况下,我只需要使用 python.

我看到两种方法:

  1. 在尝试将元组用作索引之前对其进行排序。这样,您获取元组的顺序并不重要。

    v_dict = {('vendor', 'account'):1,
            ('vendor', 'cost_center'):2,
            ('vendor', 'purchase_order'):3,
            ('vendor', 'user_name'):5,
            ('vendor', 'invoice'):6}
    
    v_dict = {tuple(sorted(k)): v for k, v in v_dict.items()}
    
    def get_vdict_value(key):
        return v_dict.get(tuple(sorted(key)))
    
  2. 使用元组的 frozenset 作为键。

    v_dict = {frozenset(k): v for k, v in v_dict.items()}
    
    def get_vdict_value(key):
        return v_dict.get(frozenset(key))
    
    

使用我们刚刚定义的函数在从字典获取密钥之前修复密钥。

pairs = [('purchase_order', 'vendor'), ('invoice','vendor'), ('vendor', 'user_name')]

for pair in pairs:
    print(pair, get_vdict_value(pair))

# ('purchase_order', 'vendor') 3
# ('invoice', 'vendor') 6
# ('vendor', 'user_name') 5