Python在同一行上打印

时间:2015-01-20 05:42:17

标签: python printing formatting

我遇到的问题是在相同的行上打印phone_sorter()和number_calls()。例如,它将打印两行phone_sorter,但number_calls将打印在它的正下方。我已经尝试了结束=''方法,但它似乎不起作用。

customers=open('customers.txt','r')
calls=open('calls.txt.','r')

def main():
    print("+--------------+------------------------------+---+---------+--------+")
    print("| Phone number | Name                         | # |Duration | Due    |")
    print("+--------------+------------------------------+---+---------+--------+")
    print(phone_sorter(), number_calls())

def time(x):
    m, s = divmod(seconds, x)
    h, m = divmod(m, x)
    return "%d:%02d:%02d" % (h, m, s)

def phone_sorter():
    sorted_no={}
    for line in customers:
        rows=line.split(";")
        sorted_no[rows[1]]=rows[0]
    for value in sorted(sorted_no.values()):
            for key in sorted_no.keys():
                if sorted_no[key] == value:
                    print(sorted_no[key],key)                            
def number_calls():
    no_calls={}
    for line in calls:
        rows=line.split(";")
        if rows[1] not in no_calls:
            no_calls[rows[1]]=1
        else:
            no_calls[rows[1]]+=1
    s={}
    s=sorted(no_calls.keys())
    for key in s:
        print(no_calls[key]) 
main()

1 个答案:

答案 0 :(得分:2)

您的关键问题是,phone_sorternumber_calls都会自行打印,并返回None。因此,打印它们的返回值是荒谬的,并且应该在它们完成所有单独行打印之后以None None行结束,这是没有意义的。

更好的方法是将它们重新构建为返回,而不是打印,它们确定的字符串,然后才安排print这些字符串格式正确在“编排”main函数中。

看起来他们每个都会返回一个list个字符串(他们现在在不同的行上打印),如果这些列表按相应的顺序排列,你可能会想zip准备印刷。

但是你的代码有些不透明,所以很难判断两者的命令是否确实对应。如果最终印刷有意义的话,他们会更好......

补充说:让我举一些细微的改进和phone_sorter的一个重大变化...:

def phone_sorter():
    sorted_no={}
    for line in customers:
        rows=line.split(";")
        sorted_no[rows[1]]=rows[0]
    sorted_keys = sorted(sorted_no, key=sorted_no.get)
    results = [(sorted_no[k], k) for k in sorted_keys]
    return results

知道了吗?除了更好地进行计算之外,核心思想是将列表放在一起并将其返回 - 它是main的工作,以便格式化并打印它,与类似的列表一致由number_calls返回(似乎是平行的)。

def number_calls():
    no_calls=collections.Counter(
        line.split(';')[1] for line in calls)
    return [no_calls(k) for k in sorted(no_calls)]

现在两个列表之间的关系对我来说并不明显,但是,假设它们是并行的,main可以这样做:

nc = no_calls()
ps = phone_sorter()
for (duration, name), numcalls in zip(ps, nc):
    print(...however you want to format the fields here...)

您在main打印的那些标题并没有告诉我每个标题下应打印哪些数据,以及如何格式化打印(宽度为 每个领域,例如)。但是,main,只有main应该是。{ 非常熟悉这些演示问题并控制它们,而其他功能则处理适当提取数据的“业务逻辑”。 “关注点分离” - 编程中的一个大问题!