【问题标题】:Finding the most occurring letter in every position of a string in a list of strings在字符串列表中的字符串的每个位置查找出现次数最多的字母
【发布时间】:2022-11-12 13:03:30
【问题描述】:

我有一个称为单词的字符串列表,例如

words = ['house', 'garden', 'kitchen', 'balloon', 'home', 'park', 'affair', 'kite', 'hello', 'portrait', 'angel', 'surfing']

我必须在字符串的每个位置找到出现次数最多的字母, 例如,让我们找到出现次数最多的第一个字母,所以我将检查我的字符串的每个第一个字母并得到 'h',因为它是自己重复次数最多的字母。 (如果我得到两个重复次数相同的字母,我会考虑字母顺序),所以第二个字母是 'a' 因为是在所有字母的第二个位置重复次数最多的字母,然后 ' r' 因为每个字符串中的每三个字母都是最常重复的字母等等,最后我想要字符串 maxOccurs = "hareennt" 这是一个包含所有最常见字母的字符串。 到目前为止,这是我编写的代码:

maxOccurs = ""
listOfChars = []

for i in range(len(words)):
    for item in words:
        listOfChars.append(item[i])

    maxOccurs += max(set(listOfChars), key=listOfChars.count)
    listOfChars.clear()

当i == 4 时,它会引发我和索引错误,显然是因为不是每个字母都有相同的长度,但我无法完成它,我将不胜感激。 附言我不能使用任何导入。

【问题讨论】:

  • “无导入”与“python 标准库”的含义不同

标签: python string list find-occurrences


【解决方案1】:

这有效:

words = ['house', 'garden', 'kitchen', 'balloon', 'home', 'park', 'affair', 'kite', 'hello', 'portrait', 'angel', 'surfing']


maxOccurs = ""
listOfChars = []

for i in range(len(max(words, key=len))):
    for item in words:
        try:
            listOfChars.append(item[i])
        except IndexError:
            pass

    maxOccurs += max(sorted(set(listOfChars)), key=listOfChars.count)
    listOfChars.clear()

我对您的代码进行了 3 处更改:

  1. 按外部 for 循环中 longest word 的长度进行迭代
  2. 在try-block中访问字符串的字符,以处理不同长度的单词
  3. 在出现次数相同的情况下,对最常用的字符集进行排序以考虑字母顺序

    我敢肯定,总体上可能有更好的方法来做到这一点,但我想保持接近你的代码。

    在这里有一个单行:

    import itertools
    
    words = ['house', 'garden', 'kitchen', 'balloon', 'home', 'park', 'affair', 'kite', 'hello', 'portrait', 'angel', 'surfing']
    maxOccurs = "".join(max(sorted(set("".join(chars))), key=chars.count) for chars in itertools.zip_longest(*words, fillvalue=""))
    

    我知道,不是很可读,但使用了导入。所以只是一个有趣的例子。

【讨论】:

  • 这行得通,谢谢,但是如果我需要更有效的解决方案怎么办?没有进口?对于非常大的列表,这需要永远
【解决方案2】:

标准库充满了很好的计数实用程序。这是一个可以做到的单线:

>>> from collections import Counter
>>> from itertools import zip_longest
>>> words = ['house', 'garden', 'kitchen', 'balloon', 'home', 'park', 'affair', 'kite', 'hello', 'portrait', 'angel', 'surfing']
>>> ''.join(Counter(filter(None, chars)).most_common(1)[0][0] for chars in zip_longest(*words))
'horeennt'

唯一的区别是它返回'horeennt' 而不是'hareennt',因为o 和a 在第二位应用的频率相同,如果出现平局,Counter.most_common(1) 将返回遇到的第一个项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2021-10-08
    • 2020-02-21
    相关资源
    最近更新 更多