python-3.x 使用特殊规则删除重复元素

tsm1rwdh  于 2023-05-19  发布在  Python
关注(0)|答案(2)|浏览(160)

重复元素序列中的中间元素只能保留。例如,处理了像[1,2,1,3,1]这样的列表,其输出应该是[2,1,3],因为列表中有三个“1”,红色的可以保留为中间的一个,第一个和第三个被删除。如果重复元素的数量是偶数,则保留中间的右边元素。例如,[ 1,2,1,3,1,1]的输出是[2,3,1],因为有四个1,第三个(或红色)是中间的那个。下面有更多的例子来帮助你理解这个规则。列表中的红色元素是应该保留的元素。
[2,1,2,3,1] -> [2,3,1]
[3,2,1] -> [3,2,1]
[1,2,3,3,2,1] -> [3,2,1]
[3,2,1,1,2,3,2,1,3,2] -> [1,3,2]
Photo of the question
我试图实现这一点,但我得到了以下输出。下面是我的实现。

def remove_duplicates(numbers):
    # Step 1: Initialize dictionary to track count and index
    count_dict = {}

    # Step 2: Count occurrences and store index
    for index, num in enumerate(numbers):
        if num in count_dict:
            count_dict[num].append(index)
        else:
            count_dict[num] = [index]

    # Step 3: Initialize list for final unique elements
    unique_elements = []

    # Step 4: Determine unique elements based on the rule
    for num, indices in count_dict.items():
        count = len(indices)
        if count == 1:
            unique_elements.append(num)
        else:
            middle_index = indices[count // 2 + count % 2 - 1]
            unique_elements.append(numbers[middle_index])

    # Step 5: Return the list of unique elements
    return unique_elements

输出:

# expected 
[1, 3, 2]

# got
[3, 2, 1]
w6lpcovy

w6lpcovy1#

使用collections.defaultdict按值对索引进行分组。拉取每组的中间索引。对结果索引进行排序,并使用它们从原始列表中检索相应的值。

from collections import defaultdict

def remove_duplicates(arr):
    d = defaultdict(list)
    for i, k in enumerate(arr):
        d[k].append(i)
    return [arr[i] for i in sorted(v[len(v) // 2] for v in d.values())]
ifmq2ha2

ifmq2ha22#

我只需要创建一个元素计数器。然后遍历列表,减少计数器,如果计数== 0,则将项添加到输出:

from collections import Counter

test_cases = [
    ([1, 2, 1, 3, 1, 1], [2, 3, 1]),
    ([2, 1, 2, 3, 1], [2, 3, 1]),
    ([3, 2, 1], [3, 2, 1]),
    ([1, 2, 3, 3, 2, 1], [3, 2, 1]),
    ([3, 2, 1, 1, 2, 3, 2, 1, 3, 2], [1, 3, 2]),
]

def fn(l):
    c = Counter(l)
    out = []
    for v in l:
        c[v] -= 1
        if c[v] == 0:
            out.append(v)
    return out

for l, ans in test_cases:
    assert fn(l) == ans

相关问题