【问题标题】:Python - Return list of dictionaries with unique Key:Value pairPython - 返回具有唯一键:值对的字典列表
【发布时间】:2016-08-19 21:16:24
【问题描述】:

我有一长串大部分不重叠的字典。但是,某些词典具有相同的“名称”字段,我只希望词典列表中的唯一名称。我希望第一次出现的名称是保留的名称,然后从列表中删除。

我在下面列出了一个简短的列表来说明这个场景:

myList = [
    {'Name':'John', 'Age':'50', 'Height':'70'},
    {'Name':'Kathy', 'Age':'43', 'Height':'65'},
    {'Name':'John','Age':'46','Height':'68'},
    {'Name':'John','Age':'50','Height':'72'}
]

我希望此列表返回第一个“John”和 Kathy,但不返回第二个或第三个 Johns 及其相关信息。

一个可以接受但不是最佳的解决方案也是不将同名的字典放在一起。

【问题讨论】:

  • 你有没有尝试过自己解决这个问题?如果您向我们展示您的尝试,而不是仅仅通过示例输入提供问题范围,您通常会在 StackOverflow 获得更好的响应/接收。

标签: python list python-3.x dictionary unique


【解决方案1】:

您可以遍历该列表并保留唯一名称的set。每次遇到新名称(即不在集合中的名称)时,将其添加到集合中,并将相应的字典添加到结果中:

def uniqueNames(dicts):
    names = set()
    result = []
    for d in dicts:
        if not d['Name'] in names:
            names.add(d['Name'])
            result.append(d)
    return result

【讨论】:

  • sets 不保证这些元素是有序的。这使得答案无关紧要,因为 OP 想要名称的 first 出现。
  • @u8y7541 再次阅读答案 - 该集合仅用于跟踪唯一性。顺序来自于迭代输入列表,结果列表保持相同的顺序。
  • if not d['Name'] in names:这正是我想要的。我以前从未使用过它
【解决方案2】:

您可以轻松地为此编写一个 for 循环。

 def getName(name):
    '''Gets first occurence of name in list of dicts.'''
    for i in myList:
        if i['Name'] == name:
            return i

【讨论】:

    【解决方案3】:

    初始列表:

    my_list = [
        {'Name':'John', 'Age':'50', 'Height':'70'},
        {'Name':'Kathy', 'Age':'43', 'Height':'65'},
        {'Name':'John','Age':'46','Height':'68'},
        {'Name':'John','Age':'50','Height':'72'}
    ]
    

    合乎逻辑(可能对新手更友好)的方式:

    names = set()
    new_list = []
    for d in my_list:
        name = d['Name']
        if name not in names:
            new_list.append(d)
            names.add(d['Name'])
    print new_list  # [{'Age': '50', 'Name': 'John', 'Height': '70'}, {'Age': '43', 'Name': 'Kathy', 'Height': '65'}]
    

    单线方式:

    new_list = {d['Name']: d for d in reversed(my_list)}.values()
    print new_list  # [{'Age': '43', 'Name': 'Kathy', 'Height': '65'}, {'Age': '50', 'Name': 'John', 'Height': '70'}]
    

    注意:单行将包含每个名称的第一次出现,但它会返回一个任意排序的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 2020-09-12
      • 2019-04-24
      • 2014-07-09
      • 2019-11-30
      • 1970-01-01
      相关资源
      最近更新 更多