元组作为字典键,顺序可能并不总是很重要
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.
我看到两种方法:
在尝试将元组用作索引之前对其进行排序。这样,您获取元组的顺序并不重要。
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)))
使用元组的 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
我有一本使用元组作为键的字典。键指的是图上两个节点之间的边,例如。 “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.
我看到两种方法:
在尝试将元组用作索引之前对其进行排序。这样,您获取元组的顺序并不重要。
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)))
使用元组的
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