Python 如何从列表中删除类似的词典并获得单个值?

Python 如何从列表中删除类似的词典并获得单个值?,python,list,dictionary,Python,List,Dictionary,我试图检测列表中彼此相似的“用户名”数据,并从列表中删除除最后一个目录之外的所有相似数据。但我不能删除。我该怎么做 a = [{'level': '46', 'Kullanıcı Adı': ' .', 'Mesaj': 'jgfkslkjghfdkskhjnfdsfhkjn'}, {'level': '46', 'Kullanıcı Adı': 'KTeX', 'Mesaj': 'Ya jager ndkslsjfodldke'},

我试图检测列表中彼此相似的“用户名”数据,并从列表中删除除最后一个目录之外的所有相似数据。但我不能删除。我该怎么做

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

最简单的方法可能是使用有序字典重建列表。Python3.6+已经命令了
dict
实现,因此将
orderedict
替换为下面的
dict
。对于较旧的python版本,请使用
collections.OrderedDict
,如图所示:

from collections import OrderedDict

b = list(OrderedDict((d['Kullanıcı Adı'], d) for d in a).values())
您可以从包含
(键、值)
对的iterable创建字典。始终使用重复键的最后一个映射。这就是
OrderedDict((d['KullanıcıAdı',d)在a中对d)所做的事情)
values()
返回的值的顺序将与键的顺序匹配,因此您可以直接提取到
列表中

尽管这种方法相对简单,但它的问题是键将按其第一次出现顺序排列,即使值将取自最后一次出现。例如:

>>> 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()))

您要删除什么?查找相似的名称或删除找到的词典是否有问题?是。对。在列表中留下唯一的值。非常感谢。我现在正在努力解决这个问题,我想我必须学习更多来解决这个问题。你可能解决了这个问题。然而,我不能解决它,因为我的知识是不够的。非常感谢您的帮助。@您可以试着运行我的代码。如果您有原始列表
a
来自collections import OrderedICT
,您可以复制并粘贴代码。非常感谢。我将进一步研究OrderedDict主题。我解决了这个问题。@sabcan。很高兴你让它工作了。如果您使用的是3.6之后的python版本,则可以使用普通的
dict
,而不是
orderedict
。我这样发布是因为它保证即使在旧版本上也能工作。