2017-08-05 17 views
1

私はサイドプロジェクトに取り組んでおり、この問題が発生しました。内側のリストの任意の数の(しかし、私は、制限を作成すると考えられてきました)が存在することができ複数のリストから同じ文字で始まるすべての単語のリストを取得する

- ['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を初めて使っているので、この場合に役立つ組み込み関数がないかどうかはわかりません。

読んでいただきありがとうございます!すべてのリストの各リスト要素についてlistOfWords []、およびあなたのリストを反復処理しながら、それを埋める...

+1

なぜあなたの例で「E」で始まる単語のリストが2つありますか? – arsho

答えて

0

私は辞書に "char" を使用したい

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

追加しますキー「CHAR」のリストに要素

else 

あなたは、新しい開始文字と辞書に新しい要素を作成し、彼のリストを初期化し、新たなリストに要素を追加します。

結果の辞書のようなものになります。

"a":[alive, amusing],"b":[boisterous],"c":[convivial], ... 
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() 
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']] 
2

1つのオプションは使用し、その後、あなたのリストの平坦化バージョンをソートすることができ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']] 
+0

この回答への私の投票、純粋なpythonic方法。あなたはリストの理解が何段階であるか説明してください。本当にありがとう。 – Ajay2588

+0

@ Ajay2588 ['groupby()'](https://docs.python.org/3/library/itertools.html#itertools.groupby)、['chain.from_iterable()'](https:// docs.python.org/3/library/itertools.html#itertools.chain.from_iterable)、['itemgetter()'](https://docs.python.org/3/library/operator.html#operator.itemgetter )、['sorted()'](https://docs.python.org/3/library/functions.html#sorted) - ご不明な点がありましたら教えてください。 – miradulo

0

リスト内包表記は、ジョブがはるかに簡単になります!

あなたは、手でそれを、iとして最初の内側のリストl[0]を反復二内側のリスト内のすべての要素を反復処理、jとしてl[1]する必要があります。あなたの条件が満たされたら、リストに追加してください!

>>> 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']] 
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']] 
関連する問題