在两列中列出字典的内容

时间:2016-05-20 23:03:34

标签: python dictionary formatting

我想在两列中显示字典。我基本上试图做this question试图通过列表实现的目标,但我需要用字典来做。

我的脚本打印当前文件夹的目录列表,带有数字。

这是脚本:

import os

files = os.listdir(os.curdir)       #get directory listing

final_dic = dict()                  #initialize the dictionary

x = 1

for item in files:                  #associate index numbers with the filenames
    final_dic[x] = item
    x+=1

print '''
       -------------
       | FILE LIST |
       -------------
       '''

for k, v in final_dic.iteritems():              #print out the enumerated listing
    print ('{0}: {1}'.format(k, v))

num = int(raw_input('\nEnter no. of file: '))   #have user select file by no.

print ('\n{0}\n'.format(final_dic[num]))        #print out corresp. filename

文件列表的输出是:

   -------------
   | FILE LIST |
   -------------

1: file1
2: file2
3: file3
etc.

问题是在包含大量文件的文件夹中,列表会滚动到屏幕顶部,所以我希望能够显示如下列表:

1: file1     4: file4
2: file2     5: file5
3: file3     6: file6
etc.

从上面链接的问题来看,zip看起来像两个列表,并从中创建一个字典,但我已经有了字典。

那么,有没有办法做到这一点?

添加评论:有些评论提到我应该使用列表,但不幸的是它必须是字典。这只是更大脚本的一部分。

3 个答案:

答案 0 :(得分:2)

我不能说我非常喜欢你所指的解决方案。

但您可以通过生成列表l来直接回收该代码,就像在那里使用一样:

l = []
for k, v in final_dic.iteritems():
    l.append('{0}: {1}'.format(k, v))

...在您的代码中打印的位置。然后使用您链接的答案。

之前我曾与https://pypi.python.org/pypi/tabulate相关联,但似乎记得错误。虽然它确实打印了带有对齐/填充的漂亮表,但它不会像要求那样打破列...

答案 1 :(得分:2)

以下仅使用简单的列格式,但至少应该让您了解如何解决问题。文件名被简单地截断为最大长度以保持列排列。请注意,文件编号比创建的files列表中的索引多一个,因此在接受用户输入时必须处理该文件。

from itertools import islice
import os

files = sorted(os.listdir(os.curdir))  # get directory listing

desired_cols = 2
whole_rows, partial_rows = divmod(len(files), desired_cols)
num_rows = whole_rows + (1 if partial_rows > 0 else 0)

iterators = islice(files, None), islice(files, num_rows, None)

for i, f1 in enumerate(iterators[0], start=1):
    j = i + num_rows
    try:
        f2 = next(iterators[1])
    except StopIteration:
        print('{:2d}: {:38}'.format(i, f1[:38]))  # second column empty
        break
    print('{:2d}: {:38}  {:2d}: {:38}'.format(i, f1[:38], j, f2[:38]))

num = int(raw_input('\nEnter no. of file: '))  # have user select file by no.
index = num - 1
print ('\n{0}\n'.format(files[index]))  # print out corresp. filename

答案 2 :(得分:1)

由于词典是任意排序的,并且您在打印前没有对其进行排序,因此您可以简单地选择一些项目并打印出来:

it = final_dic.iteritems()
for item in it:
    try:
        n = next(it)
    except StopIteration:
        print '{}: {}'.format(*item)
    else:
        print '{}: {}\t'.format(*item), '{}: {}'.format(*n)

另一种方法,itertools.izip_longest()

it = final_dic.iteritems()
for a,b in itertools.izip_longest(it, it):
    print '{}: {}'.format(*a), '\t{}: {}'.format(*b) if b else ''

使用list而不是字典,以便输出排序并逐列而不是逐行:

final_list = list(enumerate(files))
half = len(final_list)//2+1
for (idx1,val1),(idx2,val2) in itertools.izip_longest(
                               final_list[:half], final_list[half:], fillvalue=(0,'')):
    print '{}: {}'.format(idx1+1, val1) if val1 else '', '\t{}: {}'.format(idx2+1, val2) if val2 else ''

使用final_list = list(enumerate('abcde'))测试结果:

1: a    4: d
2: b    5: e
3: c