我想在两列中显示字典。我基本上试图做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
看起来像两个列表,并从中创建一个字典,但我已经有了字典。
那么,有没有办法做到这一点?
添加评论:有些评论提到我应该使用列表,但不幸的是它必须是字典。这只是更大脚本的一部分。
答案 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