Python 2:如何在元组中压缩类似的术语?

Python 2:如何在元组中压缩类似的术语?,python,python-2.7,tuples,Python,Python 2.7,Tuples,我正在使用一个元组来存储find-exec stat命令的输出,需要对其进行压缩,以便在其上运行du。输出是一个元组,每个项都是username、/path/to/file 我想把它压缩成类似用户名的组合,这样最终的结果就是username、/path/to/file1、/path/to/file2等等 有没有办法做到这一点 下面是返回我的元组的当前代码 cmd = ['find',dir_loc,'-type','f','-exec','stat','-c','%U %n','{}','+']

我正在使用一个元组来存储find-exec stat命令的输出,需要对其进行压缩,以便在其上运行du。输出是一个元组,每个项都是username、/path/to/file

我想把它压缩成类似用户名的组合,这样最终的结果就是username、/path/to/file1、/path/to/file2等等

有没有办法做到这一点

下面是返回我的元组的当前代码

cmd = ['find',dir_loc,'-type','f','-exec','stat','-c','%U %n','{}','+']
process = Popen(cmd,stdout=PIPE)
find_out = process.communicate()
exit_code = process.wait()  

find_out = find_out[0].split('\n')

out_tuple = []
for item in find_out:
    out_tuple.append(item.split(' '))
假设您有一个元组列表或表单列表列表:

out_tuple = [('user_one', 'path_one'),
             ('user_three', 'path_seven'),
             ('user_two', 'path_five'),
             ('user_one', 'path_two'),
             ('user_one', 'path_three'),
             ('user_two', 'path_four')]
你可以做:

from itertools import groupby

out_tuple.sort()
total_grouped = []
for key, group in groupby(out_tuple, lambda x: x[0]):
    grouped_list = [key] + [x[1] for x in group]
    total_grouped.append(tuple(grouped_list))
这将为您提供元组列表:

如果您从列表列表开始,则不是:

    total_grouped.append(tuple(grouped_list))
您可以取消元组构造:

    total_grouped.append(grouped_list)
不过我要说一件事,你最好像@BradBeattie建议的那样使用dict。如果以后要执行某种操作,以特殊方式处理元组或列表中的第一项,那么dict更好

它不仅在键中有唯一性的概念,而且因为嵌套有两个不同的层次,所以也不那么麻烦。首先是dict,然后是内部项,即元组或列表。这比将两个相似的集合一个嵌套在另一个中要清楚得多。

假设您有一个元组列表或表单列表:

out_tuple = [('user_one', 'path_one'),
             ('user_three', 'path_seven'),
             ('user_two', 'path_five'),
             ('user_one', 'path_two'),
             ('user_one', 'path_three'),
             ('user_two', 'path_four')]
你可以做:

from itertools import groupby

out_tuple.sort()
total_grouped = []
for key, group in groupby(out_tuple, lambda x: x[0]):
    grouped_list = [key] + [x[1] for x in group]
    total_grouped.append(tuple(grouped_list))
这将为您提供元组列表:

如果您从列表列表开始,则不是:

    total_grouped.append(tuple(grouped_list))
您可以取消元组构造:

    total_grouped.append(grouped_list)
不过我要说一件事,你最好像@BradBeattie建议的那样使用dict。如果以后要执行某种操作,以特殊方式处理元组或列表中的第一项,那么dict更好


它不仅在键中有唯一性的概念,而且因为嵌套有两个不同的层次,所以也不那么麻烦。首先是dict,然后是内部项,即元组或列表。这比将两个相似的集合一个嵌套在另一个中要清楚得多。

只需使用一个列表:

out_tuple = [('user1', 'path1'),
             ('user1', 'path2'),
             ('user2', 'path3'),
             ('user1', 'path4'),
             ('user2', 'path5'),
             ('user1', 'path6')]

d={}
for user_name, path in out_tuple:
    d.setdefault(user_name, []).append(path)

print d 
印刷品:

{'user2': ['path3', 'path5'], 'user1': ['path1', 'path2', 'path4', 'path6']}
('user2', 'path3', 'path5')
('user1', 'path1', 'path2', 'path4', 'path6')
然后,如果希望每个用户名的输出作为元组:

for user_name in d:
    print tuple([user_name]+d[user_name])   
印刷品:

{'user2': ['path3', 'path5'], 'user1': ['path1', 'path2', 'path4', 'path6']}
('user2', 'path3', 'path5')
('user1', 'path1', 'path2', 'path4', 'path6')

只需使用一份清单:

out_tuple = [('user1', 'path1'),
             ('user1', 'path2'),
             ('user2', 'path3'),
             ('user1', 'path4'),
             ('user2', 'path5'),
             ('user1', 'path6')]

d={}
for user_name, path in out_tuple:
    d.setdefault(user_name, []).append(path)

print d 
印刷品:

{'user2': ['path3', 'path5'], 'user1': ['path1', 'path2', 'path4', 'path6']}
('user2', 'path3', 'path5')
('user1', 'path1', 'path2', 'path4', 'path6')
然后,如果希望每个用户名的输出作为元组:

for user_name in d:
    print tuple([user_name]+d[user_name])   
印刷品:

{'user2': ['path3', 'path5'], 'user1': ['path1', 'path2', 'path4', 'path6']}
('user2', 'path3', 'path5')
('user1', 'path1', 'path2', 'path4', 'path6')

仅供参考,out_tuple实际上是一个列表。您是否考虑过使用列表字典,根据用户名编制索引?这似乎是解决方案。仅供参考,out\u tuple实际上是一个列表。您是否考虑过使用列表字典,根据用户名编制索引?似乎是这里的解决方案。就是这样,更多地看dict数据结构,这正是我所需要的。谢谢。就是这样,在dict数据结构中看得更多,这正是我所需要的。谢谢