2017-09-08 13 views
0

저는 Python에서 일부 JSON blob을 반복하고 요소를 추가하여 목록을 작성합니다. 때로는 요소가 단일, 때로는 이중 (또는 그 이상) 일 수도 있습니다.N> = 1 요소를 목록에 추가하십시오.

my_list = []  
for j in jsons: 
    my_list.append(j['foo']) 

my_list 내가 대신 내가 ['a', '1', 'b', '1', 'c1', 'c2']를 얻을 확장 사용하는 경우 ['a1', 'b1', ['c1', 'c2']]

되는 끝납니다.

내가 추가 할 내용이 목록인지 먼저 확인한 다음 요소별로 추가해야합니까? 또는 이미이 기능을 수행하는 더 나은 기능이 있습니까?

+6

JSON 얼룩의 불합리한 불규칙성을 고려하면 명시 적으로 확인하는 것이 충분히 합리적이라고 판단됩니다. 그러나 목록인지 확인한 다음'.extend', 그렇지 않으면'.append'를 확인합니다. 또 다른 방법은 나중에 평평하게하는 것입니다.하지만 확인하는 것이 가장 좋습니다. –

+0

데이터가 일관되게 구성된 상태로 시작되지 않는 이유는 무엇입니까? 어쩌면 당신은 그것을 만드는 코드를 고칠 수 있습니다. – Barmar

+0

@Barmar가 될 수는 있겠지만 정부가 제공하는 공개 데이터입니다. – ScottieB

답변

3

예, 각 항목 유형을 명시 적으로 확인해야합니다.

예를 들어, 당신이 쓸 수 있습니다 : 파이썬이 단순화하기 위해 ternary conditional expression를 사용할 수

['a1', 'b1', 'c1', 'c2'] 

:하지만

my_list = [] 
for json in jsons: 
    item = json['foo'] 
    my_list.extend(item if isinstance(item, list) else [item]) 
+0

세 번째 표현식을 사용하여 호출 할 올바른 방법을 선택할 수도 있습니다. 그러면'item'을 래핑 할 임시 목록을 만들지 않아도됩니다. '(mylist.extend if isinstance (item, list) else mylist.append) (item)'. – chepner

+0

맞아요, 특이하고 고급 사용으로 간주 될 수 있습니다 ... ;-) –

2

당신은 사용할 수 있습니다

# sample jsons 
jsons = [{'foo': 'a1'}, 
     {'foo': 'b1'}, 
     {'foo': ['c1', 'c2']}] 

my_list = [] 
for json in jsons: 
    item = json['foo'] 
    if isinstance(item, list): 
     my_list.extend(item) 
    else: 
     my_list.append(item) 

을 당신은 얻을 singledispatch 데코레이터를 사용하여 기본 루프에서 일부 상용구를 옮깁니다. 데코레이터는 파이썬 3.4에서 시작하는 표준 라이브러리의 functools 모듈 또는 PyPi의 singledispatch 모듈을 통해 사용할 수 있습니다.

이것은 (첫 번째) 인수의 유형에 따라 다르게 동작하는 함수 adder을 정의합니다.

@singledispatch 
def adder(item): 
    mylist.append(item) 

@adder.register(list) 
def _(item): 
    mylist.extend(item) 

mylist = [] 
for json in jsons: 
    adder(json['foo'])