【问题标题】:using min with list properly正确使用 min 和 list
【发布时间】:2016-11-14 20:44:50
【问题描述】:
text = input("enter string:")
text.lower()
counta = text.count ("a")
counte = text.count ("e")
counti = text.count ("i")
counto = text.count ("o")
countu = text.count ("u")

if counta > 0:
print ("'a'",counta)

if counte > 0:
print ("'e'",counte)

if counti> 0:
print ("'i'",counti)

if counto > 0:
print ("'o'",counto)

if countu > 0:
print ("'u':",countu)


leastFreq = [counta,counte,counti,counto,countu]
leastFreq.sort()
while 0 in leastFreq: leastFreq.remove(0)
print (leastFreq)

task = 计算单词中的元音,打印出现频率最低的元音。在这种情况下,“potato”将打印:

'a' = 1
'0' = 2

我怎样才能让它只打印'a'?我可以使用 min(leastFreq) 但这只会返回值“1”。我该怎么做才能使用格式 'a' = 1 打印,或者如果有多个元音出现相同的次数。

【问题讨论】:

  • 与您的问题没有直接关系,但text.lower() 不会自己做任何事情。你需要把它分配给一些东西。
  • 我假设这里的缩进错误是复制/粘贴到堆栈溢出的编辑器的结果?

标签: python python-3.x


【解决方案1】:

您可以使用minadditional filter condition,测试元素是否为> 0

>>> leastFreq = [4, 2, 1, 0, 3, 0]
>>> min(x for x in leastFreq if x > 0)
1

但是这样一来,您就会丢失该计数属于哪个字符的信息。您可以创建一个dictionary,而不是五个不同的变量,将元音映射到它们各自的计数:

>>> text = "potato"
>>> counts = {c: text.count(c) for c in "aeiou"}
>>> counts
{'a': 1, 'i': 0, 'e': 0, 'u': 0, 'o': 2}
>>> counts["o"]
2

然后再次将min 与生成器表达式和特定的key 函数一起使用(按计数排序,而不是按元音本身)。

>>> min((c for c in counts if counts[c] > 0), key=counts.get)
'a'

如果您对所有字母的计数感兴趣,也可以使用collections.Counter

【讨论】:

    【解决方案2】:

    尽量减少您的代码更改:

    leastFreq = [(counta, 'a'),(counte, 'e'),(counti, 'i'),(counto, 'o'),(countu, 'u')]
    leastvowel = min(leastFreq)[1]
    

    但你应该改用collections.Counter

    from collections import Counter
    text = input("Enter text: ")
    c = Counter(character for character in text if character in 'aeiou') #get counts of vowels
    least_frequent = c.most_common()[-1]
    

    least_frequent 将成为像 ('a', 1) 这样的元组

    编辑:如果您想要所有最常见的项目,您可以使用itertools.groupby

    lestfreq=list(next(itertools.groupby(c.most_common()[::-1], key=lambda x:x[1]))[1])
    

    这看起来很复杂,但它的意思是按排序顺序获取一个列表,并获取具有相同第二个值的所有元组并将它们放入一个列表中。

    【讨论】:

    • 整洁。但是,如果两个元音具有相同(最小)的频率,这将无法捕获。
    • @PrateekDewan 好点,请参阅我的编辑以获取一种可能的解决方案
    【解决方案3】:

    Counter 和 operator 的组合可以解决问题:

    from collections import Counter
    import operator
    text = raw_input("enter string:")
    freq = Counter(i for i in text if i in 'aeiou')
    items = sorted(freq.items(),key=operator.itemgetter(1))
    min = items[0][1]
    for character,frequency in items:
        if frequency == min:
            print character,frequency
    

    【讨论】:

      猜你喜欢
      • 2014-06-06
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      相关资源
      最近更新 更多