Skip to main content
 首页 » 编程设计

python之如果元组中的第一个值 = 1,则从字典值列表中删除元组

2025年05月04日17over140

首先我有一个看起来像这样的字典 d1:

d1 = {    'w' : ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'], 
          'x' : ['d', 'd', 'd', 'e', 'e'], 
          'y' : ['f', 'f', 'g'], 
          'z' : ['h', 'i']     
     } 

然后我遍历该字典并创建一个新字典,其中每个值都是一个包含两个元素的列表:整数和列表。整数是 d1 中该值中的字符串数。该列表包含元组,每个元组包含来自 d1 的字符串(在元组的位置 1)和该字符串在 d1 中出现的次数(在元组的位置 0):

d2 = {   'w' : [10, [(5, 'a'), (3, 'b'), (2, 'c')],  
         'x' : [5, [(3, 'd'), (2, 'e')], 
         'y' : [3, [(2, 'f'), (1, 'g')], 
         'z' : [2, [(1, 'h'), (1, 'i')]     
     } 

我想删除任何只出现一次的字符串('g'、'h' 和 'i'),所以最后我想要:

dFinal = {    'w' : [10, [(5, 'a'), (3, 'b'), (2, 'c')], 
              'x' : [5, [(3, 'd'), (2, 'e')], 
              'y' : [2, [(2, 'f')]     
         } 

我读了一个我认为是字典理解的示例,如果值列表的长度小于 2,则删除整个字典项目:

d = {k:v for k,v in d.items() if len(v) > 1} 

我正在尝试掌握列表/字典的理解,并希望使用类似的方法来实现我所描述的内容,并在此过程中学到一些东西。

起初我试图写一个函数,以d2为参数,但我不知道如何引用每个元组的位置0。

然后认为使用没有元组的 d1 生成 dFinal 可能比尝试更改 d2 更容易。

如果您能描述一种从 d1 和/或 d2 生成 dFinal 的干净方法,并解释思考过程,我将不胜感激。两者都将真正帮助我理解如何通过理解精确地操作字典列表。

谢谢!

请您参考如下方法:

好吧,您可以使用 Counter 对象。老实说,我会使用循环,因为它可能会更有效率。

In [1]: from collections import Counter 

编辑:以下是我实际上会如何执行此操作,没有理解:

In [17]: for k,v in d1.items(): 
    ...:     counts = Counter(v) 
    ...:     counts = [t for t in counts.items() if t[1] > 1] 
    ...:     if len(counts) > 0: 
    ...:         dfinal[k] = [sum(c[1] for c in  counts), counts] 
    ...: 
 
In [18]: dfinal 
Out[18]: 
{'w': [10, [('b', 3), ('a', 5), ('c', 2)]], 
 'x': [5, [('d', 3), ('e', 2)]], 
 'y': [2, [('f', 2)]]}