2013-03-01 2 views
-3

파이썬의 목록 안에 dict 값만 인쇄하려고합니다.파이썬에서 목록 안에있는 사전 값을 인쇄하십시오.

car_object = {} 
    cursor = self._db.execute('SELECT IDENT, MAKE, MODEL, DISPLACEMENT, POWER, LUXURY FROM CARS') 
    for row in cursor: 
     objectname = 'Car_Object_'+str(row['IDENT']) 
     # print (objectname) 
     car_object[objectname] = Cars(ident = row['IDENT'], make = row['MAKE'], model = row['MODEL'], disp = row['DISPLACEMENT'], power = row['POWER'], luxury = row['LUXURY']) 
     print(objectname, car_object[objectname]) 
     #print(row['IDENT'], row['MAKE'], row['MODEL'], row['DISPLACEMENT'], row['POWER'], row['LUXURY']) 

     yield dict(row) 

는 그래서 인쇄입니다 :

Car_Object_meA160 {'power': 55, 'ident': 'meA160', 'model': 'A160 CDI', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'N'} 
Car_Object_meA190 {'power': 92, 'ident': 'meA190', 'model': 'A190', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'Y'} 
Car_Object_meA210 {'power': 103, 'ident': 'meA210', 'model': 'A210 EVO', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'Y'} 

... 그래서 내가 지금처럼 인쇄 할 수 있도록하려면 에 :

     IDENT   MAKE   MODEL  DISP  POWER  LUX 
Car_Object_meA160  meA160  mercedes  A160 CDI  1.7   55  N 
Car_Object_meA190  meA190  mercedes  A190   1.7   92  Y 
Car_Object_meA210  meA210  mercedes  A210 EVO  1.7   103  Y 

그래서 난 할 수 있도록하려면 헤더를 일정한 순서로 정렬하여 값을 인쇄합니다. 이것을 할 수 있습니까? 감사.

+0

이 작업을 수행하는 방법을 모른다면 먼저 파이썬을 배워야합니다. 인터넷에 인쇄물을 포맷하는 방법에 대한 많은 자료가 있습니다. 파이썬은 "printf"를 사용하기가 무척 쉽습니다. – mtahmed

+0

나는 이것을하는 방법에 관해서 인터넷을 샅샅이 뒤졌고 그것을 이해할 수 없다. – engr007

+0

여기에 제공된 모든 답을 "한 줄만"얻으므로, 단순히'print' 문을'for' 루프에 넣으면 얼마나 많은 행을 얻게됩니까? 당신은 발전기 기능을 사용하고 있습니다. 발전기에서 모든 값을 읽었는지, 아니면 첫 번째 값만 읽었습니까? 왜 처음에는 발전기를 사용하고 있습니까? –

답변

1

처럼 뭔가로 대체해야한다. 이를 위해 먼저 각 열의 가장 긴 항목이 얼마나 오래 있는지 알아야합니다. 그런 다음 pad을 사용하여 주어진 문자열에 패딩 공간을 여러 개 추가 할 수 있습니다.

fields = ["ident", "make", "model", "disp", "power", "luxury"] 
max_len = {"name": max(map(len, car_objects)) + 1} 
for f in fields: 
    max_len[f] = max(map(len, [f] + [str(car[f]) for car in car_objects.values()])) 
pad = lambda s, f: str(s).ljust(max_len[f]) 

이제, 우리는 위에서 정의 된 pad 기능을 사용 car_objects의 헤더와 여러 항목을 인쇄 할 수 있습니다.

print pad("", "name") + " ".join(pad(f.upper(), f) for f in fields) 
for name, car in car_objects.items(): 
    print pad(name, "name") + " ".join(pad(car[f], f) for f in fields) 

car_objects의 요소는 파이썬 사전 있다고 가정 작동합니다. 그렇지 않은 경우 car[f]을 위의 코드에서 getattr(c, f)으로 바꾸십시오.

업데이트 : 물론 실제로 테이블을 인쇄하기 전에 모든 행을 알고있는 경우 테이블의 열을 완벽하게 정렬하는 것이 효과적입니다. 데이터베이스에서 여전히 항목을 읽는 동안 을 인쇄해야하는 경우 문자열을 채우는 공백 수를 '추측'해야 테이블에 잘 정렬됩니다. 이렇게하면 모든 것이 으로 간단 해집니다. yield 전에

print (" " * 20) + " ".join(f.upper().ljust(10) for f in fields) 

그리고 루프 내부의이 행 : 그냥 테이블 헤더를 인쇄하여 for 루프 전에이 줄을 넣어

print name.ljust(20) + " ".join(str(getattr(car, f)).ljust(10) for f in fields) 

str.ljust(n)가 정렬 된 문자열을 반환 표준 문자열 함수입니다 총 너비는 n 자 이내의 왼쪽에 있습니다. 우측 정렬과 중앙 정렬을 정렬하는 유사한 기능이 있습니다 : rjustcenter.그리고 자동차가 어떤 클래스의 인스턴스 인 것처럼 보이기 때문에 내장 함수 getattr(<object>, <attribute name>)을 사용하여 자동차의 개별 속성을 검색 할 수 있습니다 (getVariable 메소드와 비슷 함).

문자열 서식 지정에 대한 자세한 내용은 Python documentation page을 참조하십시오.

+0

은 커서의 행에 대해 1 행'을 반환합니다. objectname = 'Car_Object _'+ str (행 [ 'IDENT']) car_object [objectname] = Cars (ident = row [ 'IDENT'], make = row [ 'fields = [ "ident", "make"], 모델 = 행 [ 'MODEL'], disp = 행 [ 'DISPLACEMENT'], 전원 = 행 [ 'POWER'], 고급 = 행 [ 'LUXURY] 필드의 f에 대해 max_len [f] = { "name": max (map, len, car_object)) +1, pad = lambda, f : s + (""* (max_len [f] - len (max)] max (map (len, [f] + car_object.values ​​()의 차에 대한 getattr s)))' – engr007

+0

@ user2096860 음, 모든 자동차가'car_objects'에 추가 된 후에, 즉'for' 루프 다음에 코드를 삽입해야합니다. 그렇지 않으면 행을 정렬하는 방법? –

0

이 시도 :

#print your header labels first                              
d = {'power': 55, 'ident': 'meA160', 'model': 'A160 CDI', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'N'} 
# this is for each car                                 
headers = ['ident', 'make', 'model', 'disp', 'power', 'luxury'] # change this order if you want different order          
values = [d[h] for h in headers] 
print("{0:12}{1:12}{2:12}{3:12}{4:12}{5:12}".format(values[0], values[1], values[2], values[3], values[4], values[5])) 
+0

@ zz3599 ...이 '헤더에 h 값'[d [h]] 오류가 발생합니다.TypeError : 'Cars'객체에 subscriptable이 없습니다. ' – engr007

+0

이는 Cars 객체가 사전이 아닙니다. 당신은 내가 전체 목록이 아닌 각 행에 대해 당신에게 준 것을 사용해야합니다. – zz3599

+0

예, 데이터의 한 행만 넣으면 작동합니다 ... 인쇄하는 모든 행에 대해보다 일반적인 방식으로 만드는 방법은 무엇입니까? 30 개 이상 있습니다. – engr007

-1

예. 다음은 목록을 받아 원하는 것을 인쇄하는 빠른 기능입니다.

def output(cars): 
    print "   IDENT  MAKE  MODEL  DISP  POWER" 
    for i in cars: 
     print type(i)," ",i[ident]," ",i[make]," ",i[model]," ",i[disp]," ",i[power] 

당신이 넣은 차를 최대한 많이 인쇄해야합니다. 나는 간격에 대해 긍정적이지는 않지만.

0

다음을 시도해보십시오. 사전과 함께 테스트하여 car_object[obj][key.lower()]의 속성에 액세스합니다. 나는 당신의 자동차 클래스를 보지 않고 말할 수 있지만, 당신은 아마 까다로운 부분은 여러 테이블 항목과 테이블 머리글을 정렬한다 car_obj[obj].__getattribute__(key.lower())

car_object = {} 
car_object['Car_Object_meA160'] = {'power': 55, 'ident': 'meA160', 'model': 'A160 CDI', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'N'} 
car_object['Car_Object_meA190'] = {'power': 92, 'ident': 'meA190', 'model': 'A190', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'Y'} 
car_object['Car_Object_meA210'] = {'power': 103, 'ident': 'meA210', 'model': 'A210 EVO', 'disp': 1.7, 'make': 'mercedes', 'luxury': 'Y'} 

keys = ['IDENT', 'MAKE', 'MODEL', 'DISP', 'POWER', 'LUXURY'] 
fmt ='{:>10}' * (len(keys) + 1) 
print ' '*len('Car_Object_meA160'), fmt.format('', *keys) 

for obj in car_object: 
    print obj, fmt.format('', *([car_object[obj][key.lower()] for key in keys])) 
+0

나는 단지 이것과 함께 1 행을 얻고있다 .... 위의 예제는 ... 나는 약 30 행을 데이터베이스에서 데이터를 읽는에서 생성 된 있습니다. – engr007

+0

car_object를 통한 for 루프는 모든 "행"을 찾아야합니다. car_object.keys()를 실행하면 30 개의 키가 모두 출력됩니까? – Dhara

+0

이 방법을 다시 입력 할 수있는 방법이 있습니까? ... 제 생각에는 여기에 간단한 내용이 누락되어 있다고 생각합니다 ... 올바르게 1 행을 되돌리고 있기 때문입니다. – engr007

관련 문제