Создание повторяющихся значений уникальными в OrderedDict - PullRequest
0 голосов
/ 23 января 2019

Иметь упорядоченный dict, который имеет дубликат ключа, пары значений. Хотите сделать эти дубликаты уникальными. Например, 4244158 и 4244159 комбинация существует дважды Я хочу оставить одного из них.

Теперь код, указанный ниже, подходит для python2, так как упорядоченный dict может быть изменен, но не для python3, поэтому я сделал копию упорядоченного dict и сравнил ее с оригинальным заказанным dict

ordered_parkstop_dict = OrderedDict([('4244162', []),
                                     ('4244158', ['4244159']), 
                                     ('4244159', ['4244158']), 
                                     ('4244157', ['4244160', '4244161']),
                                     ('4244160', ['4244157', '4244161']),        
                                     ('4244161', ['4244157', '4244160'])])
new_ordered_parkstop_dict = ordered_parkstop_dict.copy()
for key, value in ordered_parkstop_dict.items():
    for k,v in ordered_parkstop_dict.items():
        klist = []
        keylist = []
        if value and v:
            if len(v)==1 and len(value)==1:
                klist.append(k), keylist.append(key)
            if (keylist == v) and (klist == value and len(value) == 1):
                new_ordered_parkstop_dict.pop(key)

Чтобы уточнить, я хочу удалить только дубликаты типа x -> [y], y -> [x], то есть списки с одним элементом.

1 Ответ

0 голосов
/ 23 января 2019

Если вы хотите удалить дубликаты, если у вас есть один элемент списка, вы можете адаптировать рецепт itertools unique_eveseen . Идея состоит в том, чтобы сохранить set из frozenset элементов и добавлять к нему только при наличии списка с одним элементом.

from collections import OrderedDict

def unique_everseen(iterable):
    seen = set()
    seen_add = seen.add
    for key, value in iterable:
        if len(value) != 1:
            yield key, value
        else:
            if frozenset((value[0], key)) not in seen:
                seen_add(frozenset((value[0], key)))
                yield key, value

res = OrderedDict(unique_everseen(dd_input.items()))

В Python3 вы ни при каких обстоятельствах не должны повторять представление, такое как dict.items, при добавлении / удалении элементов.

Результат:

print(res)

OrderedDict([('4244162', []),
             ('4244158', ['4244159']),
             ('4244157', ['4244160', '4244161']),
             ('4244160', ['4244157', '4244161']),
             ('4244161', ['4244157', '4244160'])])
...