2017-08-01 22 views
0

我做了搜索,找不到足够接近的任何东西。如何合并或连接列表和Python中的匹配记录

考虑包含文件名或任何其他对象这3名或多个列表 - 在发现列表中说出特定的目录(相关):

list1 = ['c:\\temp\\file1.txt', 'c:\\temp\\file2.txt', 'c:\\temp\\file3.txt'] 
list2 = ['d:\\myfiles\\file1.txt', 'd:\\myfiles\\file2.tx', 'd:\\myfiles\\file4.txt'] 
list3 = ['d:\\backup\\file2.txt', 'd:\\backup\\file3.txt', 'd:\\backup\\file4.txt'] 

我想获得为一个三列的表格(可Excel中,有三列管分隔TXT或类似):

column1 (c:\\temp) | column2 (d:\\myfiles) | column3 (d:\\backup) 
------------------------------------------------------------------ 
file1.txt   | file1.txt    | <blank> 
file2.txt   | file2.txt    | file2.txt 
file3.txt   | <blank>    | file3.txt 
<blank>   | file4.txt    | file4.txt 

我都榜上有名,但我不知道一个函数或方法,将排序在上面提供的时尚之列。 Python 2.7 - 就是我正在使用的。

任何想法欢迎。

-GeO

+0

列表按文件名排序吗? –

+1

这是相当一些你要写的代码... –

+0

请注意右边以前答案的“相关”链接 - 它们都有4位数范围内的upvotes(很少见到)。其中一个只需要工作... –

回答

1

我的第一步是你的清单转变成列表的字典,山姆同意。

from collections import defaultdict 

flattened_list = [s for sub in [list1, list2, list3] for s in sub] 
tracker = defaultdict(list) 

for path in flattened_list: 
    dirname, _, basename = path.rpartition('\\') 
    tracker[dirname].append(basename) 

# {'c:\\temp': ['file1.txt', 'file2.txt', 'file3.txt'], 
# 'd:\\myfiles': ['file1.txt', 'file2.txt', 'file4.txt'], 
# 'd:\\backup': ['file2.txt', 'file3.txt', 'file4.txt']} 

从这里开始,这个数据转换为一列数据的列表或行数据的列表是直线前进。

dirnames = sorted(tracker) 
basenames = sorted(set(sum(tracker.values(), []))) # a set of all file names 

# constructs a list for each directory, filling in empty slots with '<blank>' 
files = [[b if b in tracker[d] else '<blank>' for b in basenames] for d in dirnames] 

column_output = [[d] + f for d, f in zip(dirnames, files)] 
# [['c:\\temp', 'file1.txt', 'file2.txt', 'file3.txt', '<blank>'], 
# ['d:\\myfiles', 'file1.txt', 'file2.txt', '<blank>', 'file4.txt'], 
# ['d:\\backup', '<blank>', 'file2.txt', 'file3.txt', 'file4.txt']] 

row_output = zip(*column_output) 
# [('c:\\temp', 'd:\\backup', 'd:\\myfiles'), 
# ('file1.txt', '<blank>', 'file1.txt'), 
# ('file2.txt', 'file2.txt', 'file2.txt'), 
# ('file3.txt', 'file3.txt', '<blank>'), 
# ('<blank>', 'file4.txt', 'file4.txt')] 

打印这些或将它们写入你想要的方式Excel文件是另外一个问题,但应该很容易。

+0

谢谢!这就是我所坚持的......出于某种原因,我一直在'列表'模式下思考。字典是正确的结构;你是正确的出口到Excel或文本很容易 - 我已经有一个例程来做到这一点。问候!谢谢你们 : ) –

1

不会字典是你的工作问题的一个更好的数据结构?首先,让我们将数据转换成词典:

collections = [list1, list2, list3] 
files = {'\\'.join(collection[0].split('\\')[:-1]): [item.split('\\')[-1] for item in collection] for collection in collections} 

我知道这是一个很大的毛茸茸的理解,但它会给你一个很好的解释:

{'c:\\temp': ['file1.txt', 'file2.txt', 'file3.txt'], 'd:\\myfiles': ['file1.txt', 'file2.tx', 'file4.txt'], 'd:\\backup': ['file2.txt', 'file3.txt', 'file4.txt']} 

现在,以显示一个文件的方式,你的愿望,我们可以简单的钥匙环,然后将字典值:作为期望

# Headers 
for key in files.keys(): 
    print("%-15s" % key, end="") 
print("\n" + "="*44) 

#Values 
size = max(len(val) for val in files.values()) 
for i in range(size): 
    for path in files: 
     name = "file%s.txt" % str(i+1) 
     if name in files[path]: 
      print("%-15s" % name, end="") 
     else: 
      print("%-15s" % "<blank>", end="") 
    print() 

输出:

c:\temp  d:\myfiles  d:\backup 
============================================ 
file1.txt  file1.txt  <blank>   
file2.txt  <blank>  file2.txt  
file3.txt  <blank>  file3.txt 

注:This may only work for monospaced fonts.

+0

感谢所有的想法,只是我实际上只停留在'排序部分',我也在研究一些不仅仅是filex,而是文件名是绝对不变的 - 如果它存在,我会回到相关的问题(感谢洛根)的建议。 –

+0

@GeoDerthal好吧。你尝试运行我的代码吗?它是否工作? –

+0

还没有。感谢您的解决方案;我认为在一些变化中,我可能会尽快找到一些工作。 –

相关问题