繁体   English   中英

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

[英]Remove tuples from dictionary value list if first value in tuple = 1

首先,我有一个字典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)]]}

我认为这不是很好的样式,但是您可以这样做:

dFinal = {k: [sum([i for i, c in v[1] if i != 1]),
              [(i, c) for i, c in v[1] if i != 1]]
          for k, v in d2.items()
          if [(i, c) for i, c in v[1] if i != 1]}

编辑:现在更新计数。 同样,如果理解看起来像这样,那么该重构了。

这个

from collections import Counter

d2 = {k: [len(v), sorted(Counter(v).items())] for k, v in d1.items()}

dFinal = {k: [v1, [(y, x) for x, y in v2 if y > 1]] for k, (v1, v2) in d2.items()}

我的d2dFinal与您的略有不同。 这是我的d2

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

这是我的dFinal

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

但您可以轻松地自行解决。

顺便说一句:我将使用函数使字典和列表理解看起来更容易。 现在,它是不可读的。

另一种选择:速度较慢但易于遵循:

def has_dupe(lst):
    return any([x[0] > 1 for x in lst[1]])

def reduce_list(lst):
    result = [(x, y) for (x, y) in lst[1] if x > 1]
    return [sum([x for (x, y) in result]), result]

d = {key: reduce_list(value) for key, value in d2.items() if has_dupe(value)}

暂无
暂无

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

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