多维数组中如何反求重复值

2024-09-26 18:05:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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?

Tags: 数据方法numpy列表字典foo过程副本
2条回答

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

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

这个解决方案可以在适当的地方工作,这可能是一个优势,也可能不是。将其转换为返回更正的列表将很容易。它还有一个优点,就是在最坏的情况下,它只遍历一次成对的列表。在大多数情况下,它可以在结束前停止。它比我测试中来自recnac的解快了大约七倍。你知道吗

def fix_chain(pair_dict):
    first_to_pair = dict()
    this, that = None, None # candidates
    for pair in pair_dict.values():
        if pair[0] in first_to_pair: # found the collision
            this = pair
            that = first_to_pair[pair[0]]
        else:
            first_to_pair[pair[0]] = pair
        if this and this[1] in first_to_pair: # this is not reversed...
            that.reverse() # ... so that must be
            return
        if that and that[1] in first_to_pair: # that is not reversed...
            this.reverse() # ... so this must be
            return

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

用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]]

希望这能对你有所帮助,如果你有进一步的问题,请发表评论。:)

相关问题 更多 >

    热门问题