簡體   English   中英

從字典打印兩列表的 Python 函數

[英]Python function to print a two-column table from a dictionary

我目前正在為碩士學習 Python,並且正在努力提高自己的能力,因為我需要知道如何在我未來的職業生涯中編碼。

我目前有一個函數可以從字典中構建一個表,無論鍵或值的字符有多長。

但是,我正在努力變得更好,並且我確信有一種更“Pythonic”的方式來編寫這個(即更簡單的方式)。 這正是我以我有限的知識能夠得出的結論。

def salaryTable(itemsDict):
    
    lengthRight=max( [ len(k) for k,v in itemsDict.items() ] )
    lengthLeft=max( [ len(str(v)) for k,v in itemsDict.items() ] )
    
    print( "Major".ljust(lengthRight+7) + "Salary".rjust(lengthLeft+7) )
    print( '-' * (lengthRight+lengthLeft+14) )
    
    for k,v in itemsDict.items():
        print( k.ljust(lengthRight+7,'.') + str(v).rjust(lengthLeft+7) )

這是我用來測試左右兩邊的兩個字典:

# what it produces when keys or values in the dictionary are longer than the parameter's # leftWidth and rightWidth

majors={'English Composition':45000,
        'Mechanical Engineering with a concentration in Maritime Mechanics':75000,
        'Applied Math with a concentration in Computer Science':80000}



# testing on a dictionary with a long value

majors2={'English Composition':45000,
        'Mechanical Engineering':75000,
        'Applied Math':"$100,000 thousand dollars per year USD"}
```

身份標識

PEP8建議對變量和函數使用snake_case,而不是camelCase。

它應該是salary_tablelength_rightitems_dict 此外,你真的需要_dict中的items_dict嗎?

你確定 lengthLeft 和 lengthRight 是專有名詞嗎?

lengthRight 是左列的寬度,這看起來很奇怪; 也許它與列的內容有關,但 width_left 對我來說看起來更好。

Max 適用於任何迭代器,而不僅僅是列表

width_left = max( len(k) for k,v in items_dict.items() )

也可以工作,並且不會創建列表。

您可以在沒有 items() 的情況下迭代 dict 的鍵

width_left = max( len(k) for k in items_dict )

您可以進一步使用max(map(len, itemsDict)) ,但這對我來說已經足夠了。

如果未使用該變量,請用 _ 指出這一點

width_right = max( len(str(v)) for _, v in items_dict.items() )

但最好是

如果不需要鍵,請使用 .values()

width_right = max( len(str(v)) for v in items_dict.values() )

避免“幻數”(不解釋的常量)

兩個長度都加了 7; 也許最好一次添加它並命名它?

MINIMAL_WIDTH = 7
width_left = max( len(k) for k in items_dict ) + MINIMAL_WIDTH
width_right = max( len(str(v)) for v in items_dict.values() ) + MINIMAL_WIDTH

F 字符串通常更具可讀性

print(f"{k:.<{length_right}}{v:>{length_right}}")

全部一起

def salary_table(items):
    MINIMAL_WIDTH = 7
    width_left  = MINIMAL_WIDTH + max( len(k) for k in items )
    width_right = MINIMAL_WIDTH + max( len(str(v)) for v in items.values() )

    print( f"{'Major':<{width_left}}{'Salary':>{width_right}}" )
    print( '-' * (width_left + width_right) )

    for k, v in items.items():
        print( f"{k:.<{width_left}}{v:>{width_right}}" )

我對鍵和值的性質一無所知; 根據給定的值,最好將kv重命名為nameprice ,將items重命名為books

備擇方案

注意制表 也許你最好使用它而不是發明輪子? 還有PrettyTabletexttable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM