Python 2:如何在元组中压缩类似的术语?
我正在使用一个元组来存储find-exec stat命令的输出,需要对其进行压缩,以便在其上运行du。输出是一个元组,每个项都是username、/path/to/file 我想把它压缩成类似用户名的组合,这样最终的结果就是username、/path/to/file1、/path/to/file2等等 有没有办法做到这一点 下面是返回我的元组的当前代码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','{}','+']
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数据结构中看得更多,这正是我所需要的。谢谢