【问题标题】:Counting the occurrences of letters directly in a list of words with dictionaries使用字典直接计算单词列表中字母的出现次数
【发布时间】:2022-11-22 21:45:23
【问题描述】:

我在用字典计算字母在每个字母索引的不同长度的单词列表中出现的次数时遇到问题。该列表从最长到最短的单词排序。像这样:

main_list = ['elephant','mouse','tiger','dog']

对于索引0,字典应该是:
{'e':1,'m':,'t':1,'d':1}

对于索引1
{'l':1,'o':2,'i':1}

对于索引2
{'e':1,'u':1,'g':2}

依此类推,直到最长的单词结束。

输出应该是字典列表:

main_list = [{'e':1,'m':1,'t':1,'d':1},{'l':1,'o':2,'i':1},{'e':1,'u':1,'g':2}...]

为了解决这个问题,我为每个索引创建了字母列表,然后制作了一个字典来计算每个字母列表中字母的出现次数,但我想知道是否有一种方法可以直接在单词列表中计算出现的次数每个索引的字母。

【问题讨论】:

  • 试试这个results = [Counter(tp) for tp in zip(*main_list) ]
  • 要求不明确——要算短词吗?

标签: python


【解决方案1】:

您可以执行以下操作:

from collections import Counter
from itertools import zip_longest
from pprint import pprint

main_list = ["elephant", "mouse", "tiger", "dog"]

pprint(
    [
        {k: v for k, v in Counter(t).items() if k}
        for t in zip_longest(*main_list, fillvalue=None)
    ]
)

输出:

[{'d': 1, 'e': 1, 'm': 1, 't': 1},
 {'i': 1, 'l': 1, 'o': 2},
 {'e': 1, 'g': 2, 'u': 1},
 {'e': 1, 'p': 1, 's': 1},
 {'e': 1, 'h': 1, 'r': 1},
 {'a': 1},
 {'n': 1},
 {'t': 1}]

由于需要按照最长的词进行迭代,所以需要zip_longest而不是zip。使用Counter类统计字符,然后过滤掉None的键。

【讨论】:

    【解决方案2】:
    main_list = ['elephant','mouse','tiger','dog']
    
    from collections import Counter
    from itertools import zip_longest
    
    results = [Counter(filter(None,tp)) for tp in zip_longest(*main_list,fillvalue=None)]
    
    for r in results:
        print(r)
    
    # Counter({'e': 1, 'm': 1, 't': 1, 'd': 1})
    # Counter({'o': 2, 'l': 1, 'i': 1})
    # Counter({'g': 2, 'e': 1, 'u': 1})
    # Counter({'p': 1, 's': 1, 'e': 1})
    # Counter({'h': 1, 'e': 1, 'r': 1})
    # Counter({'a': 1})
    # Counter({'n': 1})
    # Counter({'t': 1})
    

    使用 zip_longest 进行迭代,直到处理最长的元素。它需要一个fillvalue,我设置为None。我也过滤了falsy值的元素(比如这个加了None)。我基于@Daniel Hao 的回答。

    【讨论】:

    • OP的要求。不清楚也没有解释。但我确实在答案中做了注释。
    【解决方案3】:

    你可以尝试使用收藏品像这样的模块计数器:

    注意:如果你想继续计数以包含最短的单词 -狗,用尽后最长那么你应该使用zip_longest。

    from collections import Counter
    
    results = [Counter(tp) for tp in zip(*main_list) ]  # it ending with longest word
    
    print(results)
    # [Counter({'e': 1, 'm': 1, 't': 1, 'd': 1}), Counter({'o': 2, 'l': 1, 'i': 1}), Counter({'g': 2, 'e': 1, 'u': 1})]
    

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多