繁体   English   中英

使用 setdefault() 从嵌套字典中的列表中删除重复项

[英]Removing duplicates from a list in a nested dictionary using setdefault()

我正在创建一个嵌套字典,其中内部字典值部分将是一个应该保持顺序的列表。 我可以实现一个解决方案,但是当我第一次创建字典(dict1)而不是使用另一个字典(dict2)来实现这个时,我想这样做? 由于我使用的是使用 jython 作为解释器的点火设计器,因此为了简单和可能的混淆,我省略了一些代码。 这个想法大部分应该是不言自明的。

 example: {20:{Mon Apr 04 00:00:00 CDT 2022: [90, 90, 1, 1, 2, 3, 4, 5]}} = {20:{Mon Apr 04 00:00:00 CDT 2022: [90, 1, 2, 3, 4, 5]}}
dict1, dict2 = defaultdict(dict), defaultdict(dict)

# Nested dictionary with duplicates and order.
for i in dataset1:
    for j dataset2:
       dict1[i[0]].setdefault(j[0], []).append(round(j[1], 2))

# Nested dictionary with no duplicates and no order.
for i in dataset1:
    for j dataset2:
        dict1[i[0]].setdefault(j[0], set()).add(round(j[1], 2))

# Here I'm able to remove the duplicates and keep order but would like to do this
# when I'm first creating the dictionary (dict1)?
dict2 = {i:{j:sorted(set(k), key=k.index) for j, k in dict1[i].items()} for i in dict1}

dict或 - 传统上 - collections.OrderedDict保留插入顺序:

from collections import OrderedDict, defaultdict

class OrderedSet(OrderedDict):
    def add(self, x):
        self[x] = None

>>> dict1 = defaultdict(lambda: defaultdict(OrderedSet))
>>> dict1[1][2].add(4)
>>> dict1[1][2].add(3)
>>> dict1[1][2].add(5)
>>> dict1[1][2].add(4)
>>> list(dict1[1][2])
[4, 3, 5]

由于您已标记Python-2.7 ,因此您可以使用OrderedDict来获取有序集,因为 dict 不保留顺序。

from collections import OrderedDict
def ordered_set(values):
    d = OrderedDict()
    for v in values:
        d[v] = None
    return list(d.keys())

dict1 = {k: {k2: ordered_set(v2) for k2, v2 in dict1[k].items()} for k,v in dict1.items()}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM