Formatting a list of text into columns

前端 未结 8 1047
我在风中等你
我在风中等你 2021-02-07 08:34

I\'m trying to output a list of string values into a 2 column format. The standard way of making a list of strings into \"normal text\" is by using the string.join

相关标签:
8条回答
  • 2021-02-07 09:21

    This works

    it = iter(skills_defs)
    for i in it:
        print('{:<60}{}'.format(i, next(it, "")))
    

    See: String format examples

    0 讨论(0)
  • 2021-02-07 09:27

    Two columns, separated by tabs, joined into lines. Look in itertools for iterator equivalents, to achieve a space-efficient solution.

    import string
    def fmtpairs(mylist):
        pairs = zip(mylist[::2],mylist[1::2])
        return '\n'.join('\t'.join(i) for i in pairs)
    
    print fmtpairs(list(string.ascii_uppercase))
    
    A   B
    C   D
    E   F
    G   H
    I   J
    ...
    

    Oops... got caught by S.Lott (thank you).

    A more general solution, handles any number of columns and odd lists. Slightly modified from S.lott, using generators to save space.

    def fmtcols(mylist, cols):
        lines = ("\t".join(mylist[i:i+cols]) for i in xrange(0,len(mylist),cols))
        return '\n'.join(lines)
    
    0 讨论(0)
  • 2021-02-07 09:27

    It's long-winded, so I'll break it into two parts.

    def columns( skills_defs, cols=2 ):
        pairs = [ "\t".join(skills_defs[i:i+cols]) for i in range(0,len(skills_defs),cols) ]
        return "\n".join( pairs )
    

    It can, obviously, be done as a single loooong statement.

    This works for an odd number of skills, also.

    0 讨论(0)
  • 2021-02-07 09:28

    I think many of these solutions are conflating two separate things into one.

    You want to:

    1. be able to force a string to be a certain width
    2. print a table

    Here's a really simple take on how to do this:

    import sys
    
    skills_defs = ["ACM:Aircraft Mechanic", "BC:Body Combat", "BIO:Biology",
    "CBE:Combat Engineer", "CHM:Chemistry", "CMP:Computers",
    "CRM:Combat Rifeman", "CVE:Civil Engineer", "DIS:Disguise",
    "ELC:Electronics","EQ:Equestrian", "FO:Forward Observer",
    "FOR:Forage", "FRG:Forgery", "FRM:Farming", "FSH:Fishing",
    "GEO:Geology", "GS:Gunsmith", "HW:Heavy Weapons", "IF:Indirect Fire",
    "INS:Instruction", "INT:Interrogation", "JP:Jet Pilot", "LB:Longbow",
    "LAP:Light Aircraft Pilot", "LCG:Large Caliber Gun", "LNG:Language",
    "LP:Lockpick", "MC:Melee Combat", "MCY:Motorcycle", "MEC:Mechanic",
    "MED:Medical", "MET:Meterology", "MNE:Mining Engineer",
    "MTL:Metallurgy", "MTN:Mountaineering", "NWH:Nuclear Warhead",
    "PAR:Parachute", "PST:Pistol", "RCN:Recon", "RWP:Rotary Wing Pilot",
    "SBH:Small Boat Handling","SCD:Scuba Diving", "SCR:Scrounging",
    "SWM:Swimming", "TW:Thrown Weapon", "TVD:Tracked Vehicle Driver",
    "WVD:Wheeled Vehicle Driver"]
    
    # The only thing "colform" does is return a modified version of "txt" that is
    # ensured to be exactly "width" characters long. It truncates or adds spaces
    # on the end as needed.
    def colform(txt, width):
        if len(txt) > width:
            txt = txt[:width]
        elif len(txt) < width:
            txt = txt + (" " * (width - len(txt)))
        return txt
    
    # Now that you have colform you can use it to print out columns any way you wish.
    # Here's one brain-dead way to print in two columns:
    for i in xrange(len(skills_defs)):
        sys.stdout.write(colform(skills_defs[i], 30))
        if i % 2 == 1:
            sys.stdout.write('\n')
    
    0 讨论(0)
  • 2021-02-07 09:31

    The format_columns function should do what you want:

    from __future__ import generators
    try: import itertools
    except ImportError: mymap, myzip= map, zip
    else: mymap, myzip= itertools.imap, itertools.izip
    
    def format_columns(string_list, columns, separator=" "):
        "Produce equal-width columns from string_list"
        sublists= []
    
        # empty_str based on item 0 of string_list
        try:
            empty_str= type(string_list[0])()
        except IndexError: # string_list is empty
            return
    
        # create a sublist for every column
        for column in xrange(columns):
                sublists.append(string_list[column::columns])
    
        # find maximum length of a column
        max_sublist_len= max(mymap(len, sublists))
    
        # make all columns same length
        for sublist in sublists:
             if len(sublist) < max_sublist_len:
                 sublist.append(empty_str)
    
        # calculate a format string for the output lines
        format_str= separator.join(
            "%%-%ds" % max(mymap(len, sublist))
             for sublist in sublists)
    
        for line_items in myzip(*sublists):
            yield format_str % line_items
    
    if __name__ == "__main__":
        skills_defs = ["ACM:Aircraft Mechanic", "BC:Body Combat", "BIO:Biology",
            "CBE:Combat Engineer", "CHM:Chemistry", "CMP:Computers",
            "CRM:Combat Rifeman", "CVE:Civil Engineer", "DIS:Disguise",
            "ELC:Electronics","EQ:Equestrian", "FO:Forward Observer",
            "FOR:Forage", "FRG:Forgery", "FRM:Farming", "FSH:Fishing",
            "GEO:Geology", "GS:Gunsmith", "HW:Heavy Weapons", "IF:Indirect Fire",
            "INS:Instruction", "INT:Interrogation", "JP:Jet Pilot", "LB:Longbow",
            "LAP:Light Aircraft Pilot", "LCG:Large Caliber Gun", "LNG:Language",
            "LP:Lockpick", "MC:Melee Combat", "MCY:Motorcycle", "MEC:Mechanic",
            "MED:Medical", "MET:Meterology", "MNE:Mining Engineer",
            "MTL:Metallurgy", "MTN:Mountaineering", "NWH:Nuclear Warhead",
            "PAR:Parachute", "PST:Pistol", "RCN:Recon", "RWP:Rotary Wing Pilot",
            "SBH:Small Boat Handling","SCD:Scuba Diving", "SCR:Scrounging",
            "SWM:Swimming", "TW:Thrown Weapon", "TVD:Tracked Vehicle Driver",
            "WVD:Wheeled Vehicle Driver"]
    
        for line in format_columns(skills_defs, 2):
            print line
    

    This assumes that you have a Python with generators available.

    0 讨论(0)
  • 2021-02-07 09:31

    This might also help you.

    for i in skills_defs:
    if skills_defs.index(i)%2 ==0:
        print(i.ljust(30),end = " ")
    else:
        print(i.ljust(30))
    
    0 讨论(0)
提交回复
热议问题