2017-11-08 12 views
1

私は非常にpythonの新機能であり、リストの分割に苦しんでいて、stackoverflowの多くの例を参照しています。次の条件でリストを分割したい場合、私は何ができますか?複数の要素と条件によるPythonの分割リスト

タスク1.「ワードリスト」の項目が収集された「データリスト」の項目が見つかったら、このようにリストを分割します。

Wordlist = ["Time", "date", "place",....] 

output = ["A","B"]["Time","C","D","E"]["Date",.....] 

特定の項目が見つかった後、タスク2は、リストはDLISTをループに進み、その後、特定の単語によって次分割およびnアイテムが含まれるであろう。例えば

word、n = no。

datalist = ["A","B", "N", "K" , "R", "Time", "2230" , "C" , "Date" , '12/05', "E" , "F", "R", "F", "K" ,"Place", "XXXXXX", "H", "I" , "J" ] 

wordlist = ["Time", "Date", "Place"] 

n = [1,2,1] 

出力:

項目の

時間、1

日、2

場所、1

....

入力に従っ

このは私呼ぶ例は、タスク1部分解決され、一方ではないタスク2: Python spliting a list based on a delimiter word

+0

質問の形式を指定してください。 – scharette

+0

あなたは何を試してみましたか?また、あなたの期待されるインプットとアウトプットは、あなたが求めるものの文言と100%一致していません。 – Aaron

+1

申し訳ありませんが、入力と出力は今修正されました。申し訳ありませんが、誤植です。 @aaron –

答えて

0

あなたがリンクしている他の答えのアプローチと同様に、より一般的な目的のソリューションにジェネレータを使用するように指示します。

def split_list(wordlist, splitwords = {}): 
    out = [] 
    worditer = iter(wordlist) 
    for word in worditer: 
     if word in splitwords: #potentially yield previous non-keyword list and build keyword list 
      if out: #yield non-keyword list 
       yield out 
      out = [word] #start new list with keyword 
      try: 
       for _ in range(splitwords[word]): #add *n* more words after keyword 
        out.append(next(worditer)) 
      except StopIteration: #not enough items after keyword 
       pass 
      yield out #yield keyword list 
      out = [] #reset accumulator 
     else: 
      out.append(word) #grow non-keyword list 
    if out: #yield trailing non-keyword list 
     yield out 

datalist = ["A","B", "N", "K" , "R", "Time", "2230" , "C" , "Date" , '12/05', "E" , "F", "R", "F", "K" ,"Place", "XXXXXX", "H", "I" , "J" ] 
splitwords = {"Time": 1, "Date": 2, "Place": 1} 

newlist = list(split_list(datalist, splitwords)) 
print(newlist) 
+0

これは実際にいくつかのエッジケースが失敗している... imma edit real quick – Aaron

+0

キーワードまたはキーワードリストで始まるエッジの場合は編集を参照してください。 – Aaron

+0

ありがとうございました!あなたの詳細なマークダウンから学ぶことは役に立ちます! @Aaron –

0

タスク1のための1つの行溶液:

[datalist[:datalist.index(wordlist[0])]] + [datalist[datalist.index(wordlist[i]):datalist.index(wordlist[i+1])] for i in range(len(wordlist)-1)] + [datalist[datalist.index(wordlist[-1]):]] 

outputs

[['A', 'B', 'N', 'K', 'R'], ['Time', '2230'], ['C'], ['Date', '12/05', 'E'], ['F', 'R', 'F', 'K'], ['Place', 'XXXXXX'], ['H', 'I', 'J']] 

タスク2:

sol = [] 
i = 0 
s = 0 
while i < len(datalist): 
    if datalist[i] in wordlist: 
     cs = n[wordlist.index(datalist[i])] 
     print(cs) 
     sol += [datalist[s:i], datalist[i:i+cs+1]] 
     i += cs 
     s = i + 1 
    i += 1 

sol.append(datalist[s:]) 

outputs

[['A', 'B', 'N', 'K', 'R'], ['Time', '2230'], ['C'], ['Date', '12/05', 'E'], ['F', 'R', 'F', 'K'], ['Place', 'XXXXXX'], ['H', 'I', 'J']] 
0
datalist = ['A', 'B', 'N', 'K', 'R', 'Time', '2230', 'C', 'Date', '12/05', 
'E', 'F', 'R', 'F', 'K', 'Place', 'XXXXXX', 'H', 'I', 'J'] 

取得言葉:文字を取得 ['Time', 'Date', 'Place', 'XXXXXX']


>>> [dl for dl in datalist if dl.isalpha() and len(dl) > 1]
は、唯一の違いは長さということである単語を取得することと同じです1に等しくなければならない。

取得番号:
>>> [dl for dl in datalist if dl.isnumeric()]
['2230']

日付行き方:
>>> [dl for dl in datalist if '/' in dl]
['12/05']
そのソリューションは少し間抜けです。より洗練されたソリューションのためには、reモジュールの使用をお勧めします。

結果をパックして結果を得ることができます。

関連する問題