【问题标题】:Counting how many values were attributed to a key an a python (3.2) dictionary计算有多少值归因于 python (3.2) 字典中的键
【发布时间】:2013-11-19 13:00:39
【问题描述】:

我确信这很愚蠢,但我根本无法绕过它。我有一个字典,像这样,每个键的值不相等:

'John greased ': ['axle', 'wheel', 'wheels', 'wheel', 'engine', ''], 
'Paul alleged ': ['truth', 'crime', 'facts', 'infidelity', 'incident', ''], 
'Tracy freed ': ['animals', 'fish', 'slaves', 'slaves', 'slaves', 'pizza'], 
'Lisa plowed ': ['field', 'field', '', '', '', ''],

我想知道每个键有多少个值,不是每个唯一值,而是每个键有多少个标记,重复与否。所以我会得到这样的结果:

John greased  5
Paul alleged  5
Tracy freed  6
Lisa plowed  2

我试图通过下面的代码来解决这个问题:

for key, value in sorted(result.items()):
         print(key, len(value)) 

但由于缺少值,所有长度都相同。 关于如何解决这个问题或在哪里找到它的任何想法?非常感谢您的帮助。

【问题讨论】:

    标签: python list python-3.x dictionary missing-data


    【解决方案1】:

    解决此问题的一种方法是更改​​最后一行:

    print(key, len([item for item in value if item])) 
    

    所以你的完整代码:

    ITEMS = {
        'John greased ': ['axle', 'wheel', 'wheels', 'wheel', 'engine', ''],
        'Paul alleged ': ['truth', 'crime', 'facts', 'infidelity', 'incident', ''],
        'Tracy freed ': ['animals', 'fish', 'slaves', 'slaves', 'slaves', 'pizza'],
        'Lisa plowed ': ['field', 'field', '', '', '', ''],
    }
    
    for key, value in ITEMS.items():
        #print value
        print(key, len([item for item in value if item]))
    

    您也可以将filterbool 一起使用:

    print(key, len(filter(bool, value)))
    

    所以,循环:

    for key, value in ITEMS.items():
        #print value
        print(key, len(filter(bool, value)))
    

    您需要在filter 上应用list,就像在Python 3 中的print(key, len(list(filter(bool, value)))) 一样。

    【讨论】:

    • @GamesBrainiac SyntaxError: invalid syntaxTypeError: object of type 'filter' has no len()
    • @OlehPrypin 那是 Python 3 的。更改以修复它 :)
    • 如果只有一个条目,这不起作用。如果只有一个单词,则计算该单词的字母数。
    【解决方案2】:

    filterNone 一起使用,它会从传递给它的迭代中过滤掉所有虚假值。

    在 Python3 中,filter 返回一个迭代器,因此您应该在其上调用 list()。:

    >>> lis = ['field', 'field', '', '', '', '']
    >>> list(filter(None, lis))
    ['field', 'field']
    >>> len(list(filter(None, lis)))
    2
    

    代码:

    >>> my_dict = {
        'John greased ': ['axle', 'wheel', 'wheels', 'wheel', 'engine', ''],
        'Paul alleged ': ['truth', 'crime', 'facts', 'infidelity', 'incident', ''],
        'Tracy freed ': ['animals', 'fish', 'slaves', 'slaves', 'slaves', 'pizza'],
        'Lisa plowed ': ['field', 'field', '', '', '', ''],
    }
    for k,v in my_dict.items():
        print (k, len(list(filter(None, v))))
    ...     
    Paul alleged  5
    Lisa plowed  2
    John greased  5
    Tracy freed  6
    

    filter(None,..) 和列表理解之间的时间比较:

    >>> lis = ['field', 'field', '', '', '', '']*100
    >>> %timeit list(filter(None, lis))
    10000 loops, best of 3: 22.2 us per loop
    >>> %timeit [item for item in lis if item]
    10000 loops, best of 3: 53.1 us per loop
    >>> lis = ['field', 'field', '', '', '', '']*10000
    >>> %timeit list(filter(None, lis))
    100 loops, best of 3: 2.36 ms per loop
    >>> %timeit [item for item in lis if item]
    100 loops, best of 3: 5.22 ms per loop
    

    【讨论】:

    • @GamesBrainiac 我没有在这里使用 lambda,所以这很好。
    • 你完全复制了我的格式化字典! :P 虽然答案很好,但我还补充说,如果他愿意,他可以使用 bool 而不是 None
    • @GamesBrainiac filterNone 等效于[item for item in iterable if item],因此不需要bool
    • 好的,downvoter 用list() 修复了filter 调用。
    • @hcwhsa 仍然是一个糟糕的方法。
    【解决方案3】:
    data = {
        'John greased ': ['axle', 'wheel', 'wheels', 'wheel', 'engine', ''], 
        'Paul alleged ': ['truth', 'crime', 'facts', 'infidelity', 'incident', ''], 
        'Tracy freed ': ['animals', 'fish', 'slaves', 'slaves', 'slaves', 'pizza'], 
        'Lisa plowed ': ['field', 'field', '', '', '', '']
    }
    
    for each in data:
        i = 0
        print each
        for item in data[each]:
            if len(item) > 0:
                i =i +1
        print i
    

    【讨论】:

      【解决方案4】:

      看看这个:

      >>> dct = {'John greased ': ['axle', 'wheel', 'wheels', 'wheel', 'engine', ''],
      ... 'Paul alleged ': ['truth', 'crime', 'facts', 'infidelity', 'incident', ''],
      ... 'Tracy freed ': ['animals', 'fish', 'slaves', 'slaves', 'slaves', 'pizza'],
      ... 'Lisa plowed ': ['field', 'field', '', '', '', '']}
      >>>
      >>> {k:sum(1 for x in v if x) for k,v in dct.items()}
      {'Paul alleged ': 5, 'Lisa plowed ': 2, 'John greased ': 5, 'Tracy freed ': 6}
      >>>
      >>> for key,value in dct.items():
      ...     print(key, sum(1 for v in value if v))
      ...
      Paul alleged  5
      Lisa plowed  2
      John greased  5
      Tracy freed  6
      >>>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-09
        • 2018-02-23
        相关资源
        最近更新 更多