Python 查找从顶部开始的字典(或任意索引)的*有序*交集的有效方法?
我正在寻找一种有效的方法来找到两个Python字典的交集,其中顺序很重要,从顶部开始。换句话说,在字典中循环,一旦它们的键或值不同,就停止。我认为通过一些例子,这是最清楚的Python 查找从顶部开始的字典(或任意索引)的*有序*交集的有效方法?,python,algorithm,dictionary,Python,Algorithm,Dictionary,我正在寻找一种有效的方法来找到两个Python字典的交集,其中顺序很重要,从顶部开始。换句话说,在字典中循环,一旦它们的键或值不同,就停止。我认为通过一些例子,这是最清楚的 {a:1,b:0}和{a:1,b:1}的交集显然是{a:1} {a:1,b:0,c:1}和{a:1,c:1,b:0}的交集就是{a:1},因为顺序很重要 {a:1,b:0}和{b:0,c:1}的交集为空,因为它们不是从同一个键开始的 我有以下功能,但我想知道是否有一个更简单/更快的方法 def find_ordered_
和{a:1,b:0}
的交集显然是{a:1,b:1}
{a:1}
和{a:1,b:0,c:1}
的交集就是{a:1,c:1,b:0}
,因为顺序很重要{a:1}
和{a:1,b:0}
的交集为空,因为它们不是从同一个键开始的{b:0,c:1}
def find_ordered_intersection(d0, d1):
d1keys = list(d1.keys())
intersection = {}
for i, (k, v) in enumerate(d0.items()):
if (k == d1keys[i]) and (v == d1[k]):
intersection.update({k:v})
else:
return intersection
p、 我很难简明扼要地描述我的目标。如果有人进行了编辑,请随意。如果您同意按插入顺序进行操作,您可以使用和执行以下操作: 输出
{'a': 1}
{'a': 1}
{'a': 1}
{}
这应该更容易理解
def find_ordered_intersection(d0, d1):
d0keys = list(d0.keys())
d1keys = list(d1.keys())
size = min(len(d0), len(d1))
dic = {}
for i in range(size):
key0 = d0keys[i]
key1 = d1keys[i]
if key0 != key1:
break
elif d0[key0] != d1[key1]:
break
else:
dic[key0] = d0[key0]
return dic
输出:
{'a': 1}
{'a': 1}
{}
这个问题可能没有很好的定义,因为字典没有保证的顺序。您显示的代码是否太慢?但是如果您循环使用它们,它们将始终具有相同的顺序,不是吗?那么我上面的函数可以用了吗?@mkrieger对于python 3.6+版本来说,键的顺序已经不仅仅是一个实现细节了。@mkrieger您的警告和我的回答对于提问者来说都是很好的信息。想解释一下@DragonBobZ吗?我认为这不适合我的问题(虽然我的问题可能还不清楚)。我想在任何一对不匹配时停止执行。因此,
{a:1,b:0,c:1}
和{a:1,b:1,c:1}
应该返回{a:1}
而不是{a:1,c:1}
@Dani Maseji{0:1,3:3},{0:2,4:3}的交点应该是{
但是你的函数返回{}
似乎我误解了键的间距和位置很重要。哦takewhile
。这就是我要找的。非常感谢@danimesejo确实更容易理解。虽然速度可能相同。谢谢!
def find_ordered_intersection(d0, d1):
intersection = {tpl[0][0]: tpl[0][1] for tpl in zip(d0.items(), d1.items()) if (tpl[0][0] == tpl[1][0]) and (tpl[0][1] == tpl[1][1])}
return intersection
#The intersection of {a: 1, b: 0} and {a: 1, b: 1} is obviously {a: 1}.
#The intersection of {a: 1, b: 0, c: 1} and {a: 1, c: 1, b: 0} is just {a: 1} since order matters.
#The intersection of {a: 1, b: 0} and {b: 0, c: 1} is empty because they don't start on the same key.
d0 = {'a': 1, 'b': 0}
d1 = {'a': 1, 'b': 1}
print(find_ordered_intersection(d0, d1))
d2 = {'a': 1, 'b': 0, 'c': 1}
d3 = {'a': 1, 'c': 1, 'b': 0}
print(find_ordered_intersection(d2, d3))
d4 = {'a': 1, 'b': 0}
d5 = {'b': 0, 'c': 1}
print(find_ordered_intersection(d4, d5))
{'a': 1}
{'a': 1}
{}