2016-10-31 4 views
2

목록 목록을 살펴보고 모든 문자를 대문자 또는 소문자로 수집 한 다음 각 문자가 1 개인 목록을 반환해야하는 함수를 작성하고 있습니다. 주문. 문자가 목록 목록에 여러 번 나타나는 경우 함수는 문자를 처음 볼 때만보고하면됩니다.목록을 검색하여 목록에서 문자를 반환하는 함수

예를 들어 목록의 목록이 [[. ','M ','M ','N ','N '], ['. ','. ','. ' 함수 출력은 [ "M", "N", "g", "b", " 비"].

코드는 작동 할 수있는 것처럼 보이지만 제대로 작동하지 않는 것 같습니다. 어떤 도움을 주신 경우

def get_symbols(lot): 

    symbols = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 

    newlot = [] 

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

파이썬 3 또는 파이썬 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)에 대해 문자가 모두 목록에 있고 이 아닌 것으로 확인 된 문자 목록에이 있는지 확인합니다. 이 경우 출력에 추가합니다. 당신이

순서는 관련이 하나에 모든 하위 목록을 연결하는 것처럼

>>> 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 이 같은 목적을 제공합니다 따를

0

이는 chain, OrderedDictisalpha을 사용하여 수행 할 수 있습니다 OrderedDict은 추가 된 오브젝트의 첫 번째 인스턴스의 순서를 보존하는 추가 보너스를 사용하여 중복을 제거하여 set과 동일한 용도로 사용됩니다. fromkeys 클래스 방법은 기본적으로 None하고있는 지정된 키와 같은 값과 사전을 만들 것, 우리의 목적은

가 마지막으로 isalpha가 당신을 말할 것이다 세트 발주자이기 때문이다 우리는 그것에 대해 걱정하지 않는 문자열이 문자이거나 문자가 아니면

레시피를 살펴볼 수도 있습니다. itertools는 가장 친한 친구이기 때문에 모든 조리법을 항상 가까이에있는 파일에 두는 것이 좋습니다. 항상 도움이됩니다

관련 문제