从无序词典列表中删除重复项

时间:2020-03-09 00:42:35

标签: python

请考虑以下内容:

[
  [
    {'name': 'fred', 'score': 19},
    {'name': 'frank', 'score': 100},
    {'name': 'bob', 'score': 99}
  ],
  [
    {'name': 'frank', 'score': 100},
    {'name': 'fred', 'score': 19},
    {'name': 'bob', 'score': 99}
  ],
  [
    {'name': 'bob', 'score': 99},
    {'name': 'frank', 'score': 100},
    {'name': 'fred', 'score': 19}
  ],
  [
    {'name': 'fred', 'score': 19},
    {'name': 'frank', 'score': 100},
    {'name': 'stu', 'score': 69}
  ]
]

忽略每个列表中字典的顺序,如何删除重复项,使输出仅是两个列表:一个带有bob,一个带有stu?

输出类似:

[
  [
    {'name': 'fred', 'score': 19},
    {'name': 'frank', 'score': 100},
    {'name': 'bob', 'score': 99}
  ],
  [
    {'name': 'fred', 'score': 19},
    {'name': 'frank', 'score': 100},
    {'name': 'stu', 'score': 69}
  ]
]

2 个答案:

答案 0 :(得分:-1)

您可以尝试这样的事情

dict_list =   [[{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'bob', 'score': 99}],
 [{'name': 'frank', 'score': 100},
  {'name': 'fred', 'score': 19},
  {'name': 'bob', 'score': 99}],
 [{'name': 'bob', 'score': 99},
  {'name': 'frank', 'score': 100},
  {'name': 'fred', 'score': 19}],
 [{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'stu', 'score': 69}]]

# create list of names you've seen before
name_lists = []
# create lists of unique lists
unique_lists = []

# loop over each list you have
for L in dict_list:

    # get list of names
    names = [i['name'] for i in L]

    # check if you've seen this set of names before
    if set(names) not in [set(n) for n in name_lists]:
        print(names)
        # save these names
        name_lists.append(names)
        # add this list to your list of unique names
        unique_lists.append(L)

输出:

['fred', 'frank', 'bob']
['fred', 'frank', 'stu']

unique_lists 输出:

[[{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'bob', 'score': 99}],
 [{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'stu', 'score': 69}]]

请注意,此方法将仅保存第一组唯一名称的分数,并在重复名称集合时丢弃分数。如果期望相同的名称可能具有不同的分数,则可能需要保存每组唯一的分数。在这种情况下,您可以按照以下PacketLoss给出的方法进行操作:

name_lists = []
unique_lists = []


for di, d in enumerate(dict_list):

    # get list of name, score tuples
    r = [(i['name'], i['score']) for i in d]
    # sort tuples alphabetically by name
    r.sort(key=lambda tup: tup[0])

    # check if these names and scores have been seen before
    if r not in name_lists:
        name_lists.append(r)
        unique_lists.append(dict_list[di])

答案 1 :(得分:-1)

由于取消了排序,因此简单的==将不匹配,我们可以通过收集数据,将其作为元组列表进行排序并检查是否以前已经找到匹配项来解决此问题。

data = [[{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'bob', 'score': 99}],
 [{'name': 'frank', 'score': 100},
  {'name': 'fred', 'score': 19},
  {'name': 'bob', 'score': 99}],
 [{'name': 'bob', 'score': 99},
  {'name': 'frank', 'score': 100},
  {'name': 'fred', 'score': 19}],
 [{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'stu', 'score': 69}]]

seen = list()
result = list()

for idx, d in enumerate(data):
    r = [(i['name'], i['score']) for i in d]
    r.sort(key=lambda tup: tup[0])
    if r not in seen:
        seen.append(r)
        result.append(data[idx])

通过这种方法,我们正在检查分数和名称是否完全匹配,这意味着如果重复项中的一个得分更改为98,它将不再被视为重复项。

输出:

[[{'name': 'fred', 'score': 19}, {'name': 'frank', 'score': 100}, {'name': 'bob', 'score': 99}], [{'name': 'fred', 'score': 19}, {'name': 'frank', 'score': 100}, {'name': 'stu', 'score': 69}]]

在数据中修改分数的输出:

data = [[{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'bob', 'score': 99}],
 [{'name': 'frank', 'score': 100},
  {'name': 'fred', 'score': 19},
  {'name': 'bob', 'score': 99}],
 [{'name': 'bob', 'score': 98},
  {'name': 'frank', 'score': 100},
  {'name': 'fred', 'score': 19}],
 [{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'stu', 'score': 69}]]

[[{'name': 'fred', 'score': 19}, {'name': 'frank', 'score': 100}, {'name': 'bob', 'score': 99}], [{'name': 'bob', 'score': 98}, {'name': 'frank', 'score': 100}, {'name': 'fred', 'score': 19}], [{'name': 'fred', 'score': 19}, {'name': 'frank', 'score': 100}, {'name': 'stu', 'score': 69}]]