Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何按项目字符串中大写字母的数量降序排列列表_Python_List_Sorting_Uppercase - Fatal编程技术网

Python 如何按项目字符串中大写字母的数量降序排列列表

Python 如何按项目字符串中大写字母的数量降序排列列表,python,list,sorting,uppercase,Python,List,Sorting,Uppercase,我有一个如下所示的列表字符串: strings = ["abc", "a", "AA", "DAabcas", "adesAA", "EFSFDAAAaaa"] 我还有一个已经存在的函数,它遍历列表中的每个元素并返回每个字符串元素中的大写字母数: capitals = 0 for i in s: if i.isupper(): capitals += 1 return capitals s是字符串中的每个项 如何使用此函数返回按降序排列的列表字符串,首先返回大写字母

我有一个如下所示的列表字符串:

strings = ["abc", "a", "AA", "DAabcas", "adesAA", "EFSFDAAAaaa"]
我还有一个已经存在的函数,它遍历列表中的每个元素并返回每个字符串元素中的大写字母数:

capitals = 0

for i in s:
    if i.isupper():
        capitals += 1
return capitals
s是字符串中的每个项

如何使用此函数返回按降序排列的列表字符串,首先返回大写字母最多的字符串,然后返回大写字母最少或没有大写字母的最短单词

以下是我想要的结果:

strings = ["EFSFDAAAaaa","DAabcas","adesAA", "AA", "abc", "a"]

谢谢。

使用您的代码,输出中存在歧义。 子字符串:DAabcas和AA都有两个大写字母。 我们可以使用第二个因素来打破联系,例如字符串长度len

def count_capitals(s):
  capitals = 0

  for i in s:
    if i.isupper():
      capitals += 1
  return capitals

strings = ["abc", "a", "AA", "DAabcas", "adesAA", "EFSFDAAAaaa"]

# Use your function as a [sorting key](https://www.geeksforgeeks.org/sorted-function-python/)
s = sorted(strings, key = lambda x: (count_capitals(x), len(x)), reverse=True)
print(s)
输出

关于,这里的资本数量和你可以做的长度

def count_capitals(word): # just a shorter way
    return len([_for _in word if _.isupper()])

if __name__ == '__main__':
    strings = ["abc", "a", "AA", "DAabcas", "adesAA", "EFSFDAAAaaa"]
    result = sorted(strings, key=lambda e: (count_capitals(e), len(e)), reverse=True)


    # Using another computation and inline it
    result = sorted(strings, key=lambda e: (sum(_.isupper() for _ in e), len(e)), reverse=True)
与其他人在1000000次迭代中使用timeit给出的答案相比,结果完全相同:


下面是另一种方法

strings.sort(key=lambda x:(numCapitals(x), len(x)), reverse=True) # a better way 
具有适当的功能:

strings.sort(key=lambda s: (sum(map(str.isupper, s)), len(s)), reverse=True)
# ['EFSFDAAAaaa', 'DAabcas', 'adesAA', 'AA', 'abc', 'a']
>>> def capcount(s):
...   capitals = 0
...   for i in s:
...     if i.isupper():
...       capitals+=1
...   return capitals

# but in python this can be translated to:

lambda s: sum(1 for c in s if c.isupper())

这个问题看起来你被困在了一个编程入门课程的问题上。好的,您已经完成了排序标准代码,让我们将其提取到一个函数中:

strings.sort(key=lambda s: (sum(map(str.isupper, s)), len(s)), reverse=True)
# ['EFSFDAAAaaa', 'DAabcas', 'adesAA', 'AA', 'abc', 'a']
>>> def capcount(s):
...   capitals = 0
...   for i in s:
...     if i.isupper():
...       capitals+=1
...   return capitals

# but in python this can be translated to:

lambda s: sum(1 for c in s if c.isupper())
现在,您可以使用此函数作为内置排序的关键参数:

因此,这与您想要的顺序相反,现在您可以做两件事中的一件,可能更多:

# Invert what you have now
min_to_max = sorted(strings, key = lambda s: sum(1 for c in s if c.isupper()))
max_to_min = min_to_max[::-1]

# Or change the sorting function around
# lambda s: sum(-1 for c in s if c.isupper())
max_to_min = sorted(strings, key = lambda s: sum(-1 for c in s if c.isupper()))

您的输出不等于所需的用户输出。您的计数大写字母最好返回sumch.isupper for ch in word。。。如果需要的话,你甚至可以把它作为一个gen exp内联,所以类似这样的东西:result=sortedstrings,key=lambda e:sumch.isupper for ch in e,lene,reverse=True if want…`@JonClements当然可以,但是对于几乎所有的情况,根据OPs问题,这里没有什么区别。。。但是,假设您有100mb的字符串。。。不需要建立一个包含所有大写字符的临时列表来计算其长度。。。所以从性能上看,它不会有很大的差异,但内存开销可能会很大。。。虽然在大多数情况下,这并不重要的实例。。。尝试使用string.ascii_大写*1000000作为源字符串编辑第三次和第五次timeit示例。。。这种差异应该更加明显then@JonClements差别非常小,但好吧,哈哈,我不会对这个^^^进行表决,即使我是唯一一个讨论多标准排序的人:DYour输出与用户的期望输出不匹配+逻辑实际上不会对所有数据都起作用,因为它允许长度超过大写字母数。
# Invert what you have now
min_to_max = sorted(strings, key = lambda s: sum(1 for c in s if c.isupper()))
max_to_min = min_to_max[::-1]

# Or change the sorting function around
# lambda s: sum(-1 for c in s if c.isupper())
max_to_min = sorted(strings, key = lambda s: sum(-1 for c in s if c.isupper()))