在带有数字的列表中查找具有字母优先级的第一项

Posted

技术标签:

【中文标题】在带有数字的列表中查找具有字母优先级的第一项【英文标题】:Find first item with alphabetical precedence in list with numbers 【发布时间】:2016-06-12 01:06:17 【问题描述】:

假设我有一个包含数字和字符串的列表对象。如果我想检索具有最高字母优先级的第一个字符串项,我该怎么做?

这是一个明显不正确的示例尝试,但非常感谢您更正需要更改哪些内容才能达到预期结果:

lst = [12, 4, 2, 15, 3, 'ALLIGATOR', 'BEAR', 'ANTEATER', 'DOG', 'CAT']

lst.sort()
for i in lst:
   if i[0] == "A":
      answer = i
print(answer)

【问题讨论】:

sorted([i for i in lst if isinstance(i, str)])[0] 呢? 你不能在没有过滤的情况下在 Python3 中对这个列表进行排序,因为你不能再比较 intstr 类型 【参考方案1】:

首先使用generator expression 过滤掉非字符串,然后使用min() 选择字母出现率最高的字符串:

>>> min(x for x in lst if isinstance(x, str))
'ALLIGATOR

【讨论】:

@AntonProtopopov,我不知道你所说的“首先转换为列表”是什么意思【参考方案2】:

IIUC 您可以使用isinstance 获取原始列表的子列表,其中仅包含字符串,然后使用sorted 按字母排序获取第一个元素:

sub_lst = [i for i in lst if isinstance(i, str)]
result = sorted(sub_lst)[0]


print(sub_lst)
['ALLIGATOR', 'BEAR', 'ANTEATER', 'DOG', 'CAT']

print(result)
'ALLIGATOR'

或者你可以使用min,就像评论中建议的@TigerhawkT3:

print(min(sub_lst))
'ALLIGATOR'

【讨论】:

min() 而不是sorted()[0] 注意:实现列表(排序所必需)需要 O(N) 空间,然后排序需要 O((N log N) 比较。另一方面,在生成器表达式上使用 min只需要 O(1) 空间和 O(N) 比较。【参考方案3】:

另一种方法是使用 filter 内置方法从整数中过滤主列表 lst

>>> min(filter(lambda s:isinstance(s, str), lst))
'ALLIGATOR'

【讨论】:

以上是关于在带有数字的列表中查找具有字母优先级的第一项的主要内容,如果未能解决你的问题,请参考以下文章

树的深度优先搜索(上)

文件夹文件怎么排序

按数字(最高优先)然后按字母(字母顺序)对对象集合进行排序

ListFragment 仅在带有 ExpandableListadpater 的片段视图中显示第一项

队列的应用:优先队列

查找O(n)时间中的n个最大条目