Python 如何在多维数组中反转重复值

Python 如何在多维数组中反转重复值,python,arrays,dictionary,iteration,Python,Arrays,Dictionary,Iteration,我有一本这样的字典(多维?): d = { 0: [3, 5], 1: [5, 7], 2: [4, 7], 3: [4, 3] } 我想在字典列表中找到任何重复的匹配位置(0)或(1)值,如果存在重复,则反转第二对匹配的数字 该词典将成为: { 0: [3, 5], 1: [5, 7], 2: [7, 4], 3: [4, 3] } 只有位置(0)是位置(0)的副本,并且只有位置(1)是位置(1)的副本(如果这有意义的话)。一个系列中只能有一个重复,在重复数据消除/翻转重复后,所有数字应链

我有一本这样的字典(多维?):

d = { 0: [3, 5], 1: [5, 7], 2: [4, 7], 3: [4, 3] }
我想在字典列表中找到任何重复的匹配位置(0)或(1)值,如果存在重复,则反转第二对匹配的数字

该词典将成为:

{ 0: [3, 5], 1: [5, 7], 2: [7, 4], 3: [4, 3] }
只有位置(0)是位置(0)的副本,并且只有位置(1)是位置(1)的副本(如果这有意义的话)。一个系列中只能有一个重复,在重复数据消除/翻转重复后,所有数字应链在一起。下面举例说明:

[0 , 1] [1 , 2] [2 , 3] [3 , 0]
我试图将所有相邻位置(1)与位置(0)匹配起来,因此值基本上是一个完整的圆(将其视为从一端连接到另一端的一系列线)。我愿意使用任何可能有助于有效解决此问题的东西,如numpy等。下面是另一个例子:

{ 'foo': [2, 9], 'bar': [3, 2], 'baz': [3, 9] } 
最终应该是:

[2, 9], [9, 3], [3, 2]
我试过很多方法,比如:

l = list(sorted(d.values()))

for i in range(0, len(l)):
    # now what the heck?

如果您完全不关心键,并确保对值将构成一个完整的圆。我想你可以试试这个:

通过dict(增强查询性能)存储每个数字的两个邻居,从任意数字开始,然后通过循环链,直到它再次到达自身

def reverse_pairs(input_dict):
    pair_values = list(input_dict.values())
    neighbors = defaultdict(list)

    for num1, num2 in pair_values:
        neighbors[num1].append(num2)
        neighbors[num2].append(num1)

    res = [pair_values[0]]
    while res[0][0] != res[-1][1]:
        a1, b1 = res[-1]
        a2, b2 = neighbors[b1]
        res.append([b1, a2 if a1 != a2 else b2])

    return res

测试用例:

def test():
    dict1 = {0: [3, 5], 1: [5, 7], 2: [7, 4], 3: [4, 3]}
    print(reverse_pairs(dict1))

    dict2 = {'foo': [2, 9], 'bar': [3, 2], 'baz': [3, 9]}
    print(reverse_pairs(dict2))
输出:

[[3, 5], [5, 7], [7, 4], [4, 3]]
[[2, 9], [9, 3], [3, 2]]

希望这将对您有所帮助,如果您还有其他问题,请发表评论。:)

像这样形成链的一组对具有这样的特性,即每个元素在对的第一个位置和第二个位置分别出现一次。如果您知道对中只有一个反转,您可以利用此属性:反转对中的第一个元素在第一个位置出现两次,而第二个元素在第一个位置根本不出现

这里的想法是:一对一对地检查,并通过其第一个元素跟踪每一对。当我们看到第二对具有相同的第一个元素时,这两对中的一对必须是反向的一对-称这些候选者。当我们看到其中一个候选者的第二个元素是另一对的第一个元素时,我们知道候选者不是反转的那个,所以我们反转另一个

此解决方案在适当的位置起作用,这可能是一个优势,也可能不是一个优势。很容易转换为返回更正列表的列表。它还有一个优点,就是在最坏的情况下,它只遍历一次配对列表。在大多数情况下,它可以在结束前停止。它比我测试中的解决方案快七倍左右

def固定链(配对):
第一对=dict()
这个,那个=没有,没有候选人
对于pair in pair_dict.values():
如果第一对中的对[0]:#找到了冲突
这是一对
那=第一对[对[0]]
其他:
第一对[对[0]]=对
如果第一对中的这个和这个[1]:#这是不可逆的。。。
那。反向()。。。那一定是
返回
如果第一对中的that和that[1]:#这是不可逆的。。。
这个。反向()。。。所以这一定是
返回

结果应该是像第一个示例那样带有原始键的dict,还是像第二个示例那样有顺序的连接边列表?@JohnZwinck:Hi John,应该是有顺序的连接边列表。字典索引其实并不重要,因为我将根据边对最终结果进行排序。非常感谢。谢谢你抽出时间回答我的问题。我回家后会进行测试,并报告结果。是什么让它比另一个答案快七倍?我真的很好奇。问得好!我还没有描述另一个答案。不过,我应该注意到,我是用一万对到几百万对的列表进行测试的。对于10000对的列表,函数分别需要1毫秒和7毫秒。可能没有多大实际意义:)