Как мне удалить похожие словари из списка и получить одно значение?

#python #list #dictionary

#python #Список #словарь

Вопрос:

Я пытаюсь обнаружить данные «Имя пользователя», которые похожи друг на друга в списке, и удалить все похожие, кроме последнего каталога из списка. Но я не могу удалить. Как я могу это сделать?

             a = [{'level': '46', 'Kullanıcı Adı': '  .', 'Mesaj': 'jgfkslkjghfdkskhjnfdsfhkjn'}, 
            {'level': '46', 'Kullanıcı Adı': 'KTeX', 'Mesaj': 'Ya jager ndkslsjfodldke'}, 
            {'level': '70', 'Kullanıcı Adı': 'Emnvdar', 'Mesaj': ' ahahahfdjggsgd'}, 
            {'level': '54', 'Kullanıcı Adı': 'Emnvdar', 'Mesaj': 'afdsfadsfdsfdsfds'}, 
            {'level': '52', 'Kullanıcı Adı': 'Lylz', 'Mesaj': 'hüptürük'}, 
            {'level': '59', 'Kullanıcı Adı': 'Emnvdar', 'Mesaj': 'jıljkdfvbfdjfdffdblkdbnfd'}, 
            {'level': '61', 'Kullanıcı Adı': 'Lylz', 'Mesaj': 'mert efsane ya'}, 
            {'level': '59', 'Kullanıcı Adı': 'Emnvdar', 'Mesaj': 'ahhqhaha'}]



          

            countest = []
            name = []

            for i in list(range(len(a)))[::-1]:
                veri = (a[i]['Kullanıcı Adı'],i)
                name.append(veri)
                C = Counter(name)
                Union = [[k,]*v for k,v in C.items()] 
                

            print(name,"name")

            print(name[0])
            otherlist= list(range(len(name)))[::-1]

            for i in otherlist:
                print(name[i][0],name[i][1])
        
  

Комментарии:

1. Что вы делаете для удаления?

2. Ваша проблема — найти похожие имена или удалить найденные словари?

3. Да. верно. чтобы оставить уникальное значение в списке.

Ответ №1:

Самый простой способ, вероятно, использовать упорядоченный словарь для перестроения списка. Python 3.6 имеет упорядоченную dict реализацию, поэтому замените OrderedDict на dict приведенное ниже. Для более старых версий python используйте, collections.OrderedDict как показано:

 from collections import OrderedDict

b = list(OrderedDict((d['Kullanıcı Adı'], d) for d in a).values())
  

Вы можете создать словарь из итерируемого, содержащего (key, value) пары. Всегда используется последнее сопоставление для повторяющихся ключей. Это то, что OrderedDict((d['Kullanıcı Adı'], d) for d in a) делает. Порядок значений, возвращаемых с помощью values() , будет соответствовать порядку ключей, поэтому вы можете просто извлечь обратно в list .

Проблема с этим подходом, несмотря на его относительную простоту, заключается в том, что ключи будут упорядочены по их первому появлению, даже если значения будут взяты из последнего. Например:

 >>> list(OrderedDict([('a', 1), ('b', 2), ('a', 3)]).values())
[3, 2]  # expected 2, 3
  

Если это проблема, вы можете выполнить итерацию по исходному списку в обратном направлении, проверяя, встречался ли вам ключ, а затем отменить результат:

 od = OrderedDict()
for d in reversed(a):
    if d['Kullanıcı Adı'] not in od:
        od[d['Kullanıcı Adı']] = d
a = list(reversed(od.values()))
  

Комментарии:

1. большое вам спасибо. Я работаю над этим прямо сейчас и возвращаюсь

2. извините, я думаю, мне нужно узнать больше, чтобы решить эту проблему. Вы, вероятно, решили проблему. Однако я не могу решить эту проблему, потому что моих знаний недостаточно. Большое вам спасибо за вашу помощь.

3. @sabcan попробуйте просто запустить мой код. Если у вас есть исходный список a и from collections import OrderedDict , вы можете просто скопировать и вставить код.

4. Большое вам спасибо. Я буду изучать тему OrderedDict дальше. Я решил проблему.

5. @sabcan. Рад, что у вас все получилось. Если вы используете версию python после 3.6, вы можете использовать normal dict вместо OrderedDict . Я разместил это так, потому что это гарантированно работает даже на старых версиях.