2017-11-09 3 views
1

나는 n 개의리스트의 목록을 가지고있다. 각 내부 목록은 (a) 문자열, (b) 빈 목록 또는 (c) 하나의 문자열을 포함하는 목록의 조합을 포함합니다. 내부 목록을 변형하여 문자열 만 포함하도록하고 싶습니다.파이썬에서 가변 깊이 목록을 평평하게한다

나는 예를 들어 이런 목록이 있습니다

[[[],["a"],"a"],[["ab"],[],"abc"]] 

와 나는 같은 싶습니다 : 나는 아마 루프를 통해 갈 수 있지만 내가 알고

[["","a","a"],["ab","","abc"]] 

을 선호하는 목록 이해력을 갖춘보다 우아한 해결책을 찾고 있습니다. 목록 이해를 통해

+0

최대 깊이 (반복 필요)는 얼마입니까? – Caramiriel

답변

1

:

lst = [[[],["a"],"a"],[["ab"],[],"abc"]] 
result = [ ['' if not v else (v[0] if isinstance(v, list) else v) for v in sub_l] 
      for sub_l in lst ] 

print(result) 

출력 :

[['', 'a', 'a'], ['ab', '', 'abc']] 
+0

이것은 정답이지만 사람이 읽을 수 없습니다! (네 잘못이 아닌 로마!) –

0
original_list = [[[],["a"],"a"],[["ab"],[],"abc"]] 
flatten = lambda x: "" if x == [] else x[0] if isinstance(x, list) else x 
flattened_list = [[flatten(i) for i in j] for j in original_list] 
+0

이 코드가 질문에 대답 할 수 있지만, 어떻게 그리고/또는 왜 문제를 해결하는지에 대한 추가 컨텍스트를 제공하면 응답의 장기적인 가치가 향상됩니다. – mx0

0

나는 그게 당신이 원하는 것입니다 있는지 확실하지 않습니다,하지만 당신은 각 재귀 솔루션을 사용하여 시도 할 수 있습니다 원래 목록에있는 목록. 함수의 코드는 다음과 같습니다.

def flatten(aList): 
    if aList == []: 
     return [""] 
    if type(aList[0]) is list: 
     return flatten(aList[0])+flatten(aList[1:]) if len(aList)>1 else flatten(aList[0]) 
    return aList[:1]+flatten(aList[1:]) if len(aList)>1 else aList[:] 
1

목록 이해 : 당신이 평평하게하려는 목록의 모든 요소로

>>> original = [[[],["a"],"a"],[["ab"],[],"abc"]] 
>>> result = [['' if not item else ''.join(item) for item in sublist] for sublist in original] 
>>> result 
[['', 'a', 'a'], ['ab', '', 'abc']] 
1

당신이 실제로 할 수있는 대신에 일부 클래스의 것을 예 (목록, 문자열)의 점검이, 반복 가능하다 오리 타이핑을 사용합니다

>> my_list = [[[],["a"],"a"],[["ab"],[],"abc"]] 
>> [list(map(lambda x: ''.join(x), elem)) for elem in my_list] 

이상이 읽을 수 :

result = [] 
for elem in my_list: 
    flatten = map(lambda x: ''.join(x), elem) 
    result.append(list(flatten)) 

결과 :

[['', 'a', 'a'], ['ab', '', 'abc']] 

무엇 뭔가를 확인 오히려 구조의 각의 능력을 적응력을 변환 메커니즘을 활용하지에 아주 파이썬입니다.