Слово из списка с наиболее повторяющимися гласными? Более питоническое решение?

#python #string #sorting #dictionary #key

Вопрос:

Вот мое текущее решение, которое, похоже, работает правильно, кроме того, что я не уверен, что делает код, если связаны два или более слов, мне также нужно поработать над этим.

 def most_repeating_vowel(word):

    vowels = {"a":0,"e":0,"i":0,"o":0,"u":0}
    for i in word:
        if i in vowels:
            vowels[i] =1
    return max(vowels.values())
       
def most_repeating_word(seq):
    return max(seq, key=most_repeating_vowel)

mylist = ["giraffe","elephant","ox","yyyyyyy","iiiii"]

most_repeating_word(mylist)
 

Есть ли более питонический способ, которым я могу справиться с этим?

Ответ №1:

Мне нравится использовать str.count :

 max(mylist, key=lambda w: max(map(w.count, 'aeiou')))
 

Сравнение с вашими примерами данных:

 Round 1  Round 2  Round 3 
16.1 us  16.0 us  15.5 us  Stef
 5.2 us   5.0 us   5.1 us  KellyBundy
 

И с более длинными словами (каждое слово умножается на 1000):

 Round 1  Round 2  Round 3 
1466 us  1476 us  1480 us  Stef
  71 us    71 us    71 us  KellyBundy
 

Тестовый код (попробуйте его онлайн!)

 from timeit import timeit
import collections

def Stef(mylist):
  def count_most_repeated_vowel(w):
    c = collections.Counter(w)
    return max(c[v] for v in 'aeiou')
  return max(mylist, key=count_most_repeated_vowel)

def KellyBundy(mylist):
  return max(mylist, key=lambda w: max(map(w.count, 'aeiou')))

funcs = Stef, KellyBundy

def benchmark(mylist, number, label, format):
  tss = [[] for _ in funcs]
  for r in range(1, 4):
    print(*(label % i for i in range(1, r 1)))
    for func, ts in zip(funcs, tss):
      t = timeit(lambda: func(mylist), number=number) / number
      ts.append(t)
      print(*(map(format, ts)), func.__name__)
    print()

mylist = ["giraffe","elephant","ox","yyyyyyy","iiiii"]
benchmark(mylist, 50000, 'Round %d ', lambda t: '%4.1f us ' % (t * 1e6))
benchmark([w * 1000 for w in mylist], 500, 'Round %d ', lambda t: 'M us ' % (t * 1e6))
 

Ответ №2:

Решение с использованием collections.Counter , которое является подклассом dict , используемым для подсчета вещей:

 import collections

mylist = ["giraffe","elephant","ox","yyyyyyy","iiiii"]

def count_most_repeated_vowel(w):
  c = collections.Counter(w)
  return max(c[v] for v in 'aeiou')

print(max(mylist, key=count_most_repeated_vowel))
# 'iiiii'