-3

Python のリスト内の 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

だから私は値だけを印刷できるようにしたい....特定の方法で注文されたヘッダーで。これを行うことは可能ですか?ありがとう。

4

4 に答える 4

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])

これで、上で定義した関数car_objectsを使用して、ヘッダーといくつかのエントリを出力できます。pad

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の要素が Python 辞書であると仮定すると、これは機能するはずです。そうでない場合は、上記のコードを に置き換えてみてくださいcar[f]getattr(c, f)

更新:もちろん、実際に印刷する前にすべての行を知っている場合にのみ、テーブルの列を完全に揃えることができます。データベースからエントリを読み取っている間にそれらを印刷する必要がある場合は、文字列をテーブルにうまく配置できるように、文字列を埋めるスペースの数を「推測」する必要があります。これにより、すべてがはるかに簡単になります。forテーブル ヘッダーを出力するためのループの前に、次の行を追加するだけです。

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

そして、ループ内の次の行の前にyield

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 ドキュメント ページを参照してください。

于 2013-03-01T15:38:33.867 に答える
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]))
于 2013-03-01T14:55:04.137 に答える
0

次のことを試してください...辞書でテストしたので、あなたが持っている属性にアクセスしますcar_object[obj][key.lower()]. Cars クラスを見ないと何とも言えませんが、おそらく次のようなものに置き換える必要があります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]))
于 2013-03-01T15:06:53.620 に答える
-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]

置いた数の車を出力するはずです。私は間隔について肯定的ではありませんが。

于 2013-03-01T15:04:56.227 に答える