2017-11-08 5 views
1

저는 파이썬에 매우 익숙하며 목록 분할에 몰두 해있어 stackoverflow의 많은 예제를 참조합니다. 다음과 같은 조건으로 목록을 분할하려면 어떻게해야합니까?여러 요소와 조건에 의한 파이썬 분할 목록

작업 1. "단어 목록"의 항목이 수집 된 "데이터 목록"에서 발견되면이 목록을 이렇게 분할하십시오. 특정 항목이 발견되면

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

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

작업 2. 목록은 특정 단어에 의해 다음과 같은 분할 될 수 n은 항목은 다음 dlist을 통해 루프를 계속 포함. 예 :

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

....

입력 따랐다

이 8,878,963,210 내 지칭 예 태스크 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에 한 줄 용액 :

[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 모듈을 사용할 것을 제안한다.

그런 다음 결과를 원하는 결과로 가져올 수 있습니다.