Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在分类字典时有些麻烦_Python_Sorting_Collections - Fatal编程技术网

Python 在分类字典时有些麻烦

Python 在分类字典时有些麻烦,python,sorting,collections,Python,Sorting,Collections,我在不同的文件夹中有相同名称的相同文件。 我想查找最新修改的,因此我使用以下脚本: import os from collections import OrderedDict home = os.path.expanduser('~/') # path of home, common for al users result = [] time = {} name = '.webpyconfig.ini' for root, dirs, files in os.walk(home):

我在不同的文件夹中有相同名称的相同文件。 我想查找最新修改的,因此我使用以下脚本:

import os

from collections import OrderedDict


home = os.path.expanduser('~/')  # path of home, common for al users
result = []
time = {}
name = '.webpyconfig.ini'
for root, dirs, files in os.walk(home):
    dirs[:] = [d for d in dirs if not d == '.Trash']
    if name in files:
        result.append(os.path.join(root, name))

for times in range(0, len(result)):
    time[times] = [result[times], os.stat(result[times]).st_mtime]
    time = OrderedDict(sorted(time.items(), key=lambda x: x[1]))
    maxtime = time[len(time) - 1][1]
    maxpath = time[len(time) - 1][0]


for k in range(0, len(time)):
    print time[k][1], time[k][0]

print ''
print maxtime, maxpath
结果是:

1448636799.0 /Users/Leo/Desktop/Webpy/.webpyconfig.ini
1448637069.0 /Users/Leo/Desktop/Webpy2/.webpyconfig.ini
1448636937.0 /Users/Leo/Documents/Webpy/.webpyconfig.ini

1448636937.0 /Users/Leo/Documents/Webpy/.webpyconfig.ini
如您所见,顺序不正确,因为Webpy2是最新创建的文件。 一些提示?

您正在将列表存储为值,并按该列表排序:

time[times] = [result[times], os.stat(result[times]).st_mtime]
排序键中的
x[1]
是整个列表,包含
[路径、时间]
值。这意味着您首先要按路径排序,而不是按修改时间排序

你有点过分复杂了;只需在
os.walk()
循环中添加时间,只需时间:

results = {}
for root, dirs, files in os.walk(home):
    dirs[:] = [d for d in dirs if not d == '.Trash']
    if name in files:
        path = os.path.join(root, name)
        results[path] = os.stat(path).m_time

sorted_by_mtime = OrderedDict(sorted(results.items(), key=lambda kv: kv[1]))
for path, time in sorted_by_mtime.items():
    print time, path

为什么每次迭代都要对时间进行排序?最后一个问题:如何仅选择最后一个修改路径?使用“for path,time in sorted…”我打印所有可能的内容,但我只想要最新的。然后不要使用排序。您可以使用相同的键使用
max()
,或者如果您发现了一条比您目前看到的路径更新的路径(存储一条路径及其mtime并根据该mtime测试新路径),则只需在
os.walk()
循环中进行测试。我发现了这一点。我删除路径并写入if循环'code'result[root]=os.stat(root).st_mtime'code'和for循环外路径w=max(result.iterkeys(),key=lambda key:result[key]),您可以完全删除
.iterkeys()
部分。当然!但是
max()
在第一个对象上循环,直接在字典上循环已经为您提供了键。所以
max(result,key=result.get)
或者在这里就足够了。:-)