我想在两列中显示字典。我基本上是想做什么 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 似乎需要两个列表并从中创建一个字典,但我已经有了一个字典。
那么,有没有办法做到这一点?
添加评论:一些评论提到我应该使用列表,但不幸的是它必须是字典。这只是更大脚本的一部分。
请您参考如下方法:
以下仅使用简单的列格式,但至少应该让您了解如何解决该问题。文件名被简单地截断为最大长度以保持列对齐。请注意,文件编号比其在创建的 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
