2016-10-31 4 views
2

リストのリストを調べ、すべての文字を大文字または小文字で収集し、見つかった各文字のうちの1つを含むリストを返す関数を作成しています注文。文字がリストのリストに複数回現れた場合、関数は最初に文字を見るときに報告するだけです。例えば、一覧が[['、' M '、' M '、' N '、' N ']、['。 '、'。 '、'。 '、' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' B "]。リストのリストから文字を取り出して返す関数

これまでのコードは動作するようですが、動作していないようです。どんな助けがありますか

def get_symbols(lot): 

    symbols = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 

    newlot = [] 

    for i in lot: 
     if i == symbols: 
      newlot.append(symbols) 
      return newlot 
     else: 
      return None 
+0

Python 3またはPython 2? –

+0

@Rob Python 3を使用する – warrior4223

答えて

1

コードにはいくつか問題があります。間違った場所にreturnを使用していて、外側のリスト(サブリストの項目ではない)だけをループし、一致した項目の代わりにsymbolsnewlotを追加しています。

def get_symbols(lot): 

    symbols = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' # You should define this OUTSIDE of the function 

    newlot = [] 

    for i in lot: # You are iterating over the outer list only here 
     if i == symbols: # == does not check if an item is in a list, use `in` here 
      newlot.append(symbols) # You are appending symbols which is the alphabet 
      return newlot # This will cause your function to exit as soon as the first iteration is over 
     else: 
      return None # No need for this 

あなたは二重のforループを使用して文字がsymbolsにあり、newlotになっていないかどうかを確認するためにinを使用することができます。

l = [['.', 'M', 'M', 'N', 'N'],['.', '.', '.', '.', 'g'], ['B', 'B', 'B', '.','g']] 
symbols = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 

def get_symbols(lot): 

    newlot = [] 

    for sublist in lot: 
     for i in sublist: 

      if i in symbols and i not in newlot: 
       newlot.append(i) 

    return newlot 

これはあなたのリストのために出力されます

>>> get_symbols(l) 
['M', 'N', 'g', 'B'] 
+0

他の回答もありがとうございましたが、これはこれを達成する最も簡単な方法のようです – warrior4223

3

既存のコードを基に作成する:

import string 

def get_symbols(lot): 
    symbols = string.ascii_lowercase + string.ascii_uppercase 
    newlot = [] 

    for sublot in lot: 
     for x in sublot: 
      if x in symbols and x not in newlot: 
       newlot.append(x) 

    return newlot 

print get_symbols([['.', 'M', 'M', 'N', 'N'],['.', '.', '.', '.', 'g'], ['B', 'B', 'B', '.','g']]) 

stringを使用すると、文字をもう少しきれいに取得できます。 (lotの各sublot)、次に各要素(x)について、それが我々のすべての文字のリストにあり、ではなく、見つかった文字のリストでであるかどうかを調べます。このような場合は、出力に追加します。

0

>>> from collections import OrderedDict 
>>> from itertools import chain 
>>> data = [['.', 'M', 'M', 'N', 'N'],['.', '.', '.', '.', 'g'], ['B', 'B', 'B', '.','g']] 
>>> temp = OrderedDict.fromkeys(chain.from_iterable(data)) 
>>> [x for x in temp if x.isalpha()] 
['M', 'N', 'g', 'B'] 
>>> 

chain.from_iterableに従うよう、これはまた、あなたが1

内のすべてのサブリストを連結しているかのよう順序が関連しているため、同じ目的を果たすだろうchainOrderedDictisalphaを使用して行うことができますOrderedDictは、追加されたオブジェクトの最初のインスタンスの順序を保持するという追加のボーナスで重複を削除することによって、setと同じ目的を果たします。 fromkeysクラスメソッドは、デフォルトではNoneで与えられたキーと同じ値を持つ辞書を作成し、我々は我々の目的のために、それを気にしないよう

を設定し、発注者である最後にisalphaはあなたを教えてくれます文字列が文字であれば、

のレシピを参照することもできます。itertoolsはあなたの親友です。これらのレシピは常に手元にあるファイルに入れることをお勧めします。

関連する問題