2017-08-01 53 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

還沒有。感謝您的解決方案;我認爲在一些變化中,我可能會盡快找到一些工作。 –

相關問題