所以我是一个菜鸟程序员...不要讨厌我的代码。但我在这里有点挣扎。我正在尝试获取字符串列表,并找到大写字母数量最少的字符串。
我尝试了几种不同的东西。- 只计算大写(不起作用(- 删除小写字母,然后执行 min(list, key=len(,但这也不起作用。
我被卡住了。。。这是我目前得到的。
test_set = {'MOo', 'QHue', 'ReP', 'XiIV', 'oEe'}
def fewest_unsolved(group):
#shortest = min(group, key = len)
#return shortest
for word in group:
for i in word:
if i == i.lower():
word.strip(i)
shortest = min(group, key = len)
return shortest
fewest_unsolved(test_set)
现在,这只返回列表中最短的第一个字符串
为什么不只将min
与计算大写字母数量的 lambda 一起使用?
>>> data = {'MOo', 'QHue', 'ReP', 'XiIV', 'oEe'}
>>> min(data, key = lambda x: sum('A' <= c <= 'Z' for c in x))
'oEe'
您可以使用列表推导来执行此操作:
def lowercase_count(word):
lowercase = [c for c in word if c.islower()]
return len(lowercase)
知道小写单词的数量后,您可以执行以下操作:
def fewest_unsolved(group):
least = lowercase_count(group[0])
current = group[0]
for word in group[1:]:
count = lowercase_count(word)
if count < least:
least = count
current = word
return current
这比其他一些解决方案更冗长,但我认为它可能更具可读性:)
哦,顺便说一下,如果你传递一个空列表,它会崩溃,所以如果你使用它要小心。
如果你的目标真的总结得很好
我正在尝试获取字符串列表,并找到大写字母数量最少的字符串。
那么可能
从字符串列表中删除小写或大写字母
(即你的头衔(不会是最好的方法。(这是"X-Y 问题"的一个例子。
这将执行前者(但不是后者(:
>>> test_set = {'MOo', 'QHue', 'ReP', 'XiIV', 'oEe'}
>>> ranked = sorted([sum('A'<=c<='Z' for c in s), s] for s in test_set)
>>> print(ranked)
[[1, 'oEe'], [2, 'MOo'], [2, 'QHue'], [2, 'ReP'], [3, 'XiIV']]
您可以看到ranked[0][1]
是具有最小大小写的字符串,ranked[-1][1]
是具有最大大小写数的字符串。 您可以直接使用 min()
而不是 sorted()
来获取最小数字字符串
>>> capcount, string = min( [sum('A'<=c<='Z' for c in s), s] for s in test_set )
但我认为使用sorted
会给你更丰富的信息,让你检查联系(以时间和内存的复杂性为代价(。