从具有二进制值的字典中生成对
Pair Generation from dictionaries with binary values
我有一个这样的输入字典:
dict1= {'AM': ['tv', 'rs', 'pq', 'MN', 'tN', 'tq', 'OP', 'tP', 'QR', 'tr'],
'BR': ['tv', 'rs', 'pq', 'MN', 'tN', 'tq', 'OP', 'tP', 'QR', 'tr']}
另外两本我要搜索的词典
dict2={'AM':{'pq','rs','tv'},'BR':{'MN','OP','QR'}}
dict3={'AM':{'tq','rs','tv'},'BR':{'tN','tP','tr'}}
预期输出
{'AM-tv': 1,
'AM-rs': 1,
'AM-pq': 1,
'AM-MN': 0,
'AM-tN': 0,
'AM-tq': 1,
'AM-OP': 0,
'AM-tP': 0,
'AM-QR': 0,
'AM-tr': 0,
'BR-tv': 0,
'BR-rs': 0,
'BR-pq': 0,
'BR-MN': 1,
'BR-tN': 1,
'BR-tq': 0,
'BR-OP': 1,
'BR-tP': 1,
'BR-QR': 1,
'BR-tr': 1}
在输出中,需要从dict1生成对。如果 dict1 键的值出现在 dict2 或 dict3 键的值中,那么它的值将在输出中为 1。如果值不存在,那么它在新字典中的值将为 0。有办法吗?
您可以通过首先为每个键创建一组 dict2
和 dict3
中存在的所有值,然后检查 [= 中键和值的所有组合来实现您想要的结果14=] 出现在那个集合中:
present = { k : dict2[k] | dict3[k] for k in dict2 }
result = { f'{k}-{v}' : (v in present[k]) * 1 for k in dict1.keys() for v in dict1[k] }
输出:
{
'AM-tv': 1, 'AM-rs': 1, 'AM-pq': 1, 'AM-MN': 0, 'AM-tN': 0,
'AM-tq': 1, 'AM-OP': 0, 'AM-tP': 0, 'AM-QR': 0, 'AM-tr': 0,
'BR-tv': 0, 'BR-rs': 0, 'BR-pq': 0, 'BR-MN': 1, 'BR-tN': 1,
'BR-tq': 0, 'BR-OP': 1, 'BR-tP': 1, 'BR-QR': 1, 'BR-tr': 1
}
注意 - 将布尔值乘以 1
与使用 int(...)
将其转换为整数相同,但速度更快。
一个选项是在我们遍历 dict1
时对 dict1
列表中的每个元素进行集合成员检查:
out = {}
for k, lst in dict1.items():
s = dict2[k] | dict3[k]
for v in lst:
out[f"{k}-{v}"] = (v in s) * 1
我们也可以编写与字典理解相同的代码(但它比其他选项慢,因为我们设置联合 len(lst)
次而不是在循环中设置一次):
out = {f"{k}-{v}": (v in dict2[k] | dict3[k]) * 1 for k, lst in dict1.items() for v in lst}
输出:
{'AM-tv': 1,
'AM-rs': 1,
'AM-pq': 1,
'AM-MN': 0,
'AM-tN': 0,
'AM-tq': 1,
'AM-OP': 0,
'AM-tP': 0,
'AM-QR': 0,
'AM-tr': 0,
'BR-tv': 0,
'BR-rs': 0,
'BR-pq': 0,
'BR-MN': 1,
'BR-tN': 1,
'BR-tq': 0,
'BR-OP': 1,
'BR-tP': 1,
'BR-QR': 1,
'BR-tr': 1}
您可以为此使用两个简单的嵌套循环。
这是一个应该适用于大多数 python 版本的变体:
out = {}
dicts = [dict2, dict3]
for k,l in dict1.items():
for v in l:
out[f'{k}-{v}'] = 1 if any(v in d[k] for d in dicts) else 0
或者,作为字典理解:
out = {f'{k}-{v}': 1 if any(v in d[k] for d in dicts) else 0
for k,l in dict1.items() for v in l}
输出:
{'AM-tv': 1,
'AM-rs': 1,
'AM-pq': 1,
'AM-MN': 0,
'AM-tN': 0,
'AM-tq': 1,
'AM-OP': 0,
'AM-tP': 0,
'AM-QR': 0,
'AM-tr': 0,
'BR-tv': 0,
'BR-rs': 0,
'BR-pq': 0,
'BR-MN': 1,
'BR-tN': 1,
'BR-tq': 0,
'BR-OP': 1,
'BR-tP': 1,
'BR-QR': 1,
'BR-tr': 1}
我有一个这样的输入字典:
dict1= {'AM': ['tv', 'rs', 'pq', 'MN', 'tN', 'tq', 'OP', 'tP', 'QR', 'tr'],
'BR': ['tv', 'rs', 'pq', 'MN', 'tN', 'tq', 'OP', 'tP', 'QR', 'tr']}
另外两本我要搜索的词典
dict2={'AM':{'pq','rs','tv'},'BR':{'MN','OP','QR'}}
dict3={'AM':{'tq','rs','tv'},'BR':{'tN','tP','tr'}}
预期输出
{'AM-tv': 1,
'AM-rs': 1,
'AM-pq': 1,
'AM-MN': 0,
'AM-tN': 0,
'AM-tq': 1,
'AM-OP': 0,
'AM-tP': 0,
'AM-QR': 0,
'AM-tr': 0,
'BR-tv': 0,
'BR-rs': 0,
'BR-pq': 0,
'BR-MN': 1,
'BR-tN': 1,
'BR-tq': 0,
'BR-OP': 1,
'BR-tP': 1,
'BR-QR': 1,
'BR-tr': 1}
在输出中,需要从dict1生成对。如果 dict1 键的值出现在 dict2 或 dict3 键的值中,那么它的值将在输出中为 1。如果值不存在,那么它在新字典中的值将为 0。有办法吗?
您可以通过首先为每个键创建一组 dict2
和 dict3
中存在的所有值,然后检查 [= 中键和值的所有组合来实现您想要的结果14=] 出现在那个集合中:
present = { k : dict2[k] | dict3[k] for k in dict2 }
result = { f'{k}-{v}' : (v in present[k]) * 1 for k in dict1.keys() for v in dict1[k] }
输出:
{
'AM-tv': 1, 'AM-rs': 1, 'AM-pq': 1, 'AM-MN': 0, 'AM-tN': 0,
'AM-tq': 1, 'AM-OP': 0, 'AM-tP': 0, 'AM-QR': 0, 'AM-tr': 0,
'BR-tv': 0, 'BR-rs': 0, 'BR-pq': 0, 'BR-MN': 1, 'BR-tN': 1,
'BR-tq': 0, 'BR-OP': 1, 'BR-tP': 1, 'BR-QR': 1, 'BR-tr': 1
}
注意 - 将布尔值乘以 1
与使用 int(...)
将其转换为整数相同,但速度更快。
一个选项是在我们遍历 dict1
时对 dict1
列表中的每个元素进行集合成员检查:
out = {}
for k, lst in dict1.items():
s = dict2[k] | dict3[k]
for v in lst:
out[f"{k}-{v}"] = (v in s) * 1
我们也可以编写与字典理解相同的代码(但它比其他选项慢,因为我们设置联合 len(lst)
次而不是在循环中设置一次):
out = {f"{k}-{v}": (v in dict2[k] | dict3[k]) * 1 for k, lst in dict1.items() for v in lst}
输出:
{'AM-tv': 1,
'AM-rs': 1,
'AM-pq': 1,
'AM-MN': 0,
'AM-tN': 0,
'AM-tq': 1,
'AM-OP': 0,
'AM-tP': 0,
'AM-QR': 0,
'AM-tr': 0,
'BR-tv': 0,
'BR-rs': 0,
'BR-pq': 0,
'BR-MN': 1,
'BR-tN': 1,
'BR-tq': 0,
'BR-OP': 1,
'BR-tP': 1,
'BR-QR': 1,
'BR-tr': 1}
您可以为此使用两个简单的嵌套循环。
这是一个应该适用于大多数 python 版本的变体:
out = {}
dicts = [dict2, dict3]
for k,l in dict1.items():
for v in l:
out[f'{k}-{v}'] = 1 if any(v in d[k] for d in dicts) else 0
或者,作为字典理解:
out = {f'{k}-{v}': 1 if any(v in d[k] for d in dicts) else 0
for k,l in dict1.items() for v in l}
输出:
{'AM-tv': 1,
'AM-rs': 1,
'AM-pq': 1,
'AM-MN': 0,
'AM-tN': 0,
'AM-tq': 1,
'AM-OP': 0,
'AM-tP': 0,
'AM-QR': 0,
'AM-tr': 0,
'BR-tv': 0,
'BR-rs': 0,
'BR-pq': 0,
'BR-MN': 1,
'BR-tN': 1,
'BR-tq': 0,
'BR-OP': 1,
'BR-tP': 1,
'BR-QR': 1,
'BR-tr': 1}