从多个列表中获取所有以相同字母开头的单词列表

时间:2017-08-05 15:59:20

标签: python

我正在进行一个侧面项目,我遇到了这个问题。基本上,我正在处理的输入是一个列表列表,其中内部列表看起来像这样:

- ['operating', 'alive', 'effective', 'rapid', 'progressive', 'working', 'mobile']
- ['enjoyable', 'pleasant', 'entertaining', 'amusing', 'lively', 'boisterous', 'convivial', 'merry', 'witty']

可以有任意数量的内部列表(但我考虑过创建一个限制)。我想要实现的是返回以相同字母开头的每个列表中的单词列表。例如,从上面我们得到的结果如下:

[alive, amusing], [effective, enjoyable], [effective, entertaining], [progressive, pleasant] ...

我的问题是,什么是好方法?我已经考虑通过整个字母表并使用布尔数组来跟踪哪个字母在每个列表中以该字母开头有一个单词,但它似乎效率低下,我对这种方法不满意。

例如(不完整,但仅供参考..):

d = dict.fromkeys(ascii_lowercase, False)    
for c in ascii_lowercase:
    found = False
    for item in description:
        for syn in item:
           if syn.startswith(c):
               found = True
        d[c] = found

然后从每个列表中抓取以标记为“True”的字母开头的单词以构建输出列表。

我错过了一种更简单的方法吗?我是Python的新手,所以我不确定我是否缺少在这种情况下可能有用的内置函数。

感谢阅读!

6 个答案:

答案 0 :(得分:2)

一个选项可能是对列表的展平版本进行排序,然后使用groupby和自定义键将不同的第一个字母作为组进行排序。

[list(grp) for _,grp in groupby(sorted(chain.from_iterable(li)), key=itemgetter(0))]

示例

>>> from itertools import groupby, chain
>>> from operator import itemgetter

>>> li = [['operating', 'alive', 'effective', 
           'rapid', 'progressive', 'working', 'mobile'], 
          ['enjoyable', 'pleasant', 'entertaining', 'amusing',
           'lively', 'boisterous', 'convivial', 'merry', 'witty']]

>>> [list(grp) for _,grp in 
     groupby(sorted(chain.from_iterable(li)), key=itemgetter(0))]
[['alive', 'amusing'],
 ['boisterous'],
 ['convivial'],
 ['effective', 'enjoyable', 'entertaining'],
 ['lively'],
 ['merry', 'mobile'],
 ['operating'],
 ['pleasant', 'progressive'],
 ['rapid'],
 ['witty', 'working']]

答案 1 :(得分:1)

列表理解将使工作变得更加简单!

您需要将第一个内部列表l[0]作为i进行迭代,并将其与第二个内部列表中的每个元素进行迭代,l[1]j。如果您的条件满足,请将它们添加到列表中!

>>> l
[['operating', 'alive', 'effective', 'rapid', 'progressive', 'working', 'mobile'], ['enjoyable', 'pleasant', 'entertaining', 'amusing', 'lively', 'boisterous', 'convivial', 'merry', 'witty']]

>>> [[i,j] for j in l[1] for i in l[0] if j.startswith(i[0])]
[['effective', 'enjoyable'], ['progressive', 'pleasant'], ['effective', 'entertaining'], ['alive', 'amusing'], ['mobile', 'merry'], ['working', 'witty']]

答案 2 :(得分:0)

我使用字典“char”:listOfWords [],并在迭代列表时填写它...

对于所有列表的每个列表元素:

if dictionary contains the "char" with whom the element starts with 

将元素添加到键“char”

的列表中
else 

使用新的起始字符在字典中创建新元素,初始化其列表并将元素添加到新列表中。

生成的字典将类似于:

"a":[alive, amusing],"b":[boisterous],"c":[convivial], ...

答案 3 :(得分:0)

使用将每个字母映射到单词列表的字典。这是一些示例代码:

from collections import defaultdict

letterWordsDict = defaultdict(lambda: [])

# Let ls contain sub-lists of words.
for subls in ls:
    for word in subls:
        letterWordsDict[word[0]].append(word)

groupedWords = letterWordsDict.values()

答案 4 :(得分:0)

如果要列出以相同字符开头的单词,可以使用以下代码段。

Python 3(假设您只有小写字母)

import string 

outer = [
    ['operating', 'alive', 'effective', 'rapid', 'progressive', 'working', 'mobile'],
    ['enjoyable', 'pleasant', 'entertaining', 'amusing', 'lively', 'boisterous', 'convivial', 'merry', 'witty']
]

lowercase = string.ascii_lowercase
data = {lowercase[i]:[] for i in range(26)}
for inner in outer:
    for word in inner:
        data[word[0]].append(word)

flat_list = []
for character in sorted(data.keys()):
    if len(data[character])!=0:
        flat_list.append(sorted(data[character]))

print(flat_list)

<强>输出:

[['alive', 'amusing'], ['boisterous'], ['convivial'], ['effective', 'enjoyable', 'entertaining'], ['lively'], ['merry', 'mobile'], ['operating'], ['pleasant', 'progressive'], ['rapid'], ['witty', 'working']]

答案 5 :(得分:0)

我首先将列表列表展平,然后按照该键的第一个字母排序,最后我将组值提取到列表中,然后将整个列表包装成一个列表。

>>> from operator import itemgetter
>>> from itertools import chain

>>> items = [['operating', 'alive', 'effective', 'rapid', 'progressive', 'working', 'mobile'], ['enjoyable', 'pleasant', 'entertaining', 'amusing', 'lively', 'boisterous', 'convivial', 'merry', 'witty']]


>>> first_item = itemgetter (0)

>>> flattened_items = chain.from_iterable (items)

>>> list (list (gitems) for _, gitems in groupby (sorted (flattened_items, key = first_item), key = first_item))

[['alive', 'amusing'], ['boisterous'], ['convivial'], ['effective', 'enjoyable', 'entertaining'], ['lively'], ['mobile', 'merry'], ['operating'], ['progressive', 'pleasant'], ['rapid'], ['working', 'witty']]