python根据字母表获取列表元素

时间:2014-03-18 13:15:08

标签: python list alphabet

我有一个按字母顺序排列的名单,如:

list = ['ABC', 'ACE', 'BED', 'BRT', 'CCD', ..]

如何从每封首字母中获取元素?我必须一次迭代列表吗?或者python有一些功能吗?对python来说,这可能是一个非常天真的问题。

假设我想从名称开始的第二个元素开始,这个案例我得到了' ACE'。

6 个答案:

答案 0 :(得分:3)

使用generator expressionitertools.islice

>>> import itertools
>>> names = ['ABC', 'ACE', 'BED', 'BRT', 'CCD']
>>> next(itertools.islice((name for name in names if name.startswith('A')), 1, 2), 'no-such-name')
'ACE'

>>> names = ['ABC', 'BBD', 'BED', 'BRT', 'CCD']
>>> next(itertools.islice((name for name in names if name.startswith('A')), 1, 2), 'no-such-name')
'no-such-name'

答案 1 :(得分:3)

如果你要进行多次搜索,你应该一次性地浏览所有内容并构建一个字典(或者,为了简化它,collections.defaultdict):

from collections import defaultdict

d = defaultdict(list)

words = ['ABC', 'ACE', 'BED', 'BRT', 'CCD', ...]

for word in words:
    d[word[0]].append(word)

(请注意,您不应该为自己的变量list命名,因为它会影响内置变量。)

现在,您可以轻松查询以"A"开头的第二个单词:

d["A"][1] == "ACE"

或每封信的前两个字:

first_two = {c: w[:2] for c, w in d.items()}

答案 2 :(得分:1)

只需按照第一个字符

分组所有元素
from itertools import groupby
from operator import itemgetter

example = ['ABC', 'ACE', 'BED', 'BRT', 'CCD']


d = {g:list(values) for g, values in groupby(example, itemgetter(0))}

现在获取一个以:

开头的值
print d.get('A', [])

当你有一个静态列表并且会有多个查询时,这是最有用的,因为你可能会看到,第三个项目以' A'开头。在O(1)

完成

答案 3 :(得分:0)

您可能想要使用list comprehensions

mylist = ['ABC', 'ACE', 'BED', 'BRT', 'CCD']
elements_starting_with_A = [i for i in mylist if i[0] == 'A']
>>> ['ABC', 'ACE']
second = elements_starting_with_A[1]
>>> 'ACE'

答案 4 :(得分:0)

除了其他人提到的列表理解之外,列表还有一个sort()方法。

mylist = ['AA', 'BB', 'AB', 'CA', 'AC']
newlist = [i for i in mylist if i[0] == 'A']
newlist.sort()
newlist
>>> ['AA', 'AB', 'AC']

答案 5 :(得分:0)

简单的解决方案是迭代O(n)中的整个列表:

(name for name in names if name.startswith('A'))

但是,您可以对名称进行排序,并在O(log(n))中搜索应该在索引上或之后的项目(使用字典比较)。模块bisect将帮助您找到界限:

from bisect import bisect_left

names = ['ABC', 'ACE', 'BED', 'BRT', 'CCD']

names.sort() 

lower = bisect_left(names, 'B')
upper = bisect_left(names, chr(1+ord('B')))

print [names[i] for i in range(lower, upper)] 
# ['BED', 'BRT']