我有一个按字母顺序排列的名单,如:
list = ['ABC', 'ACE', 'BED', 'BRT', 'CCD', ..]
如何从每封首字母中获取元素?我必须一次迭代列表吗?或者python有一些功能吗?对python来说,这可能是一个非常天真的问题。
假设我想从名称开始的第二个元素开始,这个案例我得到了' ACE'。
答案 0 :(得分:3)
使用generator expression和itertools.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']