Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找从顶部开始的字典(或任意索引)的*有序*交集的有效方法?_Python_Algorithm_Dictionary - Fatal编程技术网

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_

我正在寻找一种有效的方法来找到两个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_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}
{}