在python中检测dict数组中重复键值的方法?

在python中检测dict数组中重复键值的方法?,python,dictionary,Python,Dictionary,鉴于以下代码: a = [{"name": "Sport"}, {"name": "Games"}, {"name": "Videos"}, {"name": "Sport"}] 如何确定a变量中的另一个dict是否具有相同的名称值?在上面的例子中,结果应该返回Sport 提前谢谢 有很多很棒的方法。Python中的规范用法可能是使用collections.Counter 如果你所需要知道的只是某个东西是否是一个复制品,而不是它被复制了多少次,你可以通过使用一个SEED集合来简化它 可能最过分

鉴于以下代码:

a = [{"name": "Sport"}, {"name": "Games"}, {"name": "Videos"}, {"name": "Sport"}]
如何确定a变量中的另一个dict是否具有相同的名称值?在上面的例子中,结果应该返回Sport


提前谢谢

有很多很棒的方法。Python中的规范用法可能是使用collections.Counter

如果你所需要知道的只是某个东西是否是一个复制品,而不是它被复制了多少次,你可以通过使用一个SEED集合来简化它

可能最过分设计的方法是按名称值对dict进行排序,然后运行groupby并检查每个组的长度

from itertools import groupby
from operator import itemgetter

namegetter = itemgetter('name')

new_a = sorted(a, key=namegetter)

groups = groupby(new_a, namegetter)

for groupname, dicts in groups:
    if len(list(dicts)) > 1:
        print(groupname)

有很多很棒的方法。Python中的规范用法可能是使用collections.Counter

如果你所需要知道的只是某个东西是否是一个复制品,而不是它被复制了多少次,你可以通过使用一个SEED集合来简化它

可能最过分设计的方法是按名称值对dict进行排序,然后运行groupby并检查每个组的长度

from itertools import groupby
from operator import itemgetter

namegetter = itemgetter('name')

new_a = sorted(a, key=namegetter)

groups = groupby(new_a, namegetter)

for groupname, dicts in groups:
    if len(list(dicts)) > 1:
        print(groupname)

集合是这里使用的一种有用的数据结构,因为与列表不同,集合具有固定时间的插入和包含测试

def first_duplicate_name(dictlist):
    seen = set()
    seen_add = seen.add
    for dct in dictlist:
        k = dct['name']
        if k in seen: # constant time AKA O(1)
            return k
        else:
            seen_add(k) # also O(1)

集合是这里使用的一种有用的数据结构,因为与列表不同,集合具有固定时间的插入和包含测试

def first_duplicate_name(dictlist):
    seen = set()
    seen_add = seen.add
    for dct in dictlist:
        k = dct['name']
        if k in seen: # constant time AKA O(1)
            return k
        else:
            seen_add(k) # also O(1)

这是基于@AdamSmith的答案,但由于使用了列表理解,因此略短一些:

from collections import Counter

a = [{"name": "Sport"}, {"name": "Games"}, {"name": "Videos"}, {"name": "Sport"}]
[name for name, count in Counter(x['name'] for x in a).items() if count > 1]
因此,我们将得到一个重复列表:

['Sport']

这是基于@AdamSmith的答案,但由于使用了列表理解,因此略短一些:

from collections import Counter

a = [{"name": "Sport"}, {"name": "Games"}, {"name": "Videos"}, {"name": "Sport"}]
[name for name, count in Counter(x['name'] for x in a).items() if count > 1]
因此,我们将得到一个重复列表:

['Sport']
还有两种方法:

>>> seen = set()
>>> {n for n in (d['name'] for d in a) if n in seen or seen.add(n)}
{'Sport'}

>>> seen = set()
>>> {n for d in a for n in [d['name']] if n in seen or seen.add(n)}
{'Sport'}

>>> k, seen = 'name', set()
>>> {d[k] for d in a if d[k] in seen or seen.add(d[k])}
{'Sport'}

>>> seen = {}
>>> {d['name'] for i, d in enumerate(a) if seen.setdefault(d['name'], i) != i}
{'Sport'}

>>> seen = {}
>>> {d['name'] for d in a if seen.setdefault(d['name'], id(d)) != id(d)}
{'Sport'}

>>> x = set(), set()
>>> for n in (d['name'] for d in a): x[n in x[0]].add(n)
>>> x[1]
{'Sport'}
还有两种方法:

>>> seen = set()
>>> {n for n in (d['name'] for d in a) if n in seen or seen.add(n)}
{'Sport'}

>>> seen = set()
>>> {n for d in a for n in [d['name']] if n in seen or seen.add(n)}
{'Sport'}

>>> k, seen = 'name', set()
>>> {d[k] for d in a if d[k] in seen or seen.add(d[k])}
{'Sport'}

>>> seen = {}
>>> {d['name'] for i, d in enumerate(a) if seen.setdefault(d['name'], i) != i}
{'Sport'}

>>> seen = {}
>>> {d['name'] for d in a if seen.setdefault(d['name'], id(d)) != id(d)}
{'Sport'}

>>> x = set(), set()
>>> for n in (d['name'] for d in a): x[n in x[0]].add(n)
>>> x[1]
{'Sport'}

同样,不仅仅是名称键。测试可能包含的任何内容。@MalikBrahimi OP显式要求测试重复的名称。同样,不仅仅是名称键。测试可能包含的任何内容。@MalikBrahimi OP显式要求测试重复的名称。有点难理解,但很好地使用了或短路。有点难理解,但很好地使用了或短路