2017-10-12 59 views
0

我導入兩組六個csv文件(每個文件都帶有3列)並將它們保存到一個名單。我的基本數據結構是這樣的(假設組2 1 CSV文件):Python:(工作但速度慢)導入多個CSV文件,找到唯一標識符,然後在原始CSV列表中搜索相應的元組值

total = [ [ ["Name", 6, 4.3],["Name2", 7, 5.5] ] [ ["Name3", 12, 5.7], ["Name4", 8, 9.2] ] ] 

所以總[0]的整個第一組的CSV文件(所有六個),總[0] [0]是集合0中的第一個單獨csv文件,total [0] [0] [0]是第一個條目,total [0] [0] [0] [0]是標識符的名稱。

接下來,我展開了列表並製作了另一個包含來自所有CSV文件的唯一名稱的列表。我的基本數據結構是這樣的(每組CSV文件):

unique = [ [ Name1, Name2, Name3, Name4 ] [Name1, Name2, Name3, Name4] ] 

完成。所以這是棘手的問題。我想要做的是創建另一個列表,在其中通過所有唯一名稱工作,並從總共[0] [0]到[0] [6]列表中保存在列表中的每個CSV文件中提取相應的元組數據。所以每個獨特的價值應該拉出6個數字。

這是我得到的。

def CollectProteinInformation(total, unique): 

spectralcount = [] 

for y in range(len(total)): #For every test set 

    spectralcountbuffer = [] 

    for x in range(len(unique[y])): #for every unique value in set y 
     spectralcountbuffer2 = [] 
     for i in range(len(total[y])): #for every csv file in state y 
      SpectraIndex = next((q for q, n in enumerate(total[y][i]) if str(n[0]) == str(unique[y][x])), "N/A") # Go through the list and, using the unique ID, find if it's in the total list. 
      if SpectraIndex != "N/A": 
       spectralcountbuffer2.append(total[y][i][SpectraIndex][1]) 
      else: 
       spectralcountbuffer2.append(0.1) # <-- Spectral Fraction insert here 
     spectralcountbuffer.append(spectralcountbuffer2) 
    spectralcount.append(spectralcountbuffer) 

print(spectralcount) 
return spectralcount 

這適用於200 Ids(< 1秒)。對於7000個獨特的Ids(7000個循環×6個循環×枚舉列表)來說不是那麼好。每組6個CSV文件大約需要40秒。

我的結果會像元組:[ [1,2,1,2,3,1] [5,7,3,2,9,8]...[8,5,4,3,5,2] ]

在這個列表中的每個條目對應於每一個唯一ID六個獨立的CSV文件值。

有關更復雜的列表理解的任何建議?還是我傻傻地使用了這麼多的緩衝區?關於理解,我相當虛弱,但(q for q, n in enumerate(total[y][i]) if str(n[0]) == str(unique[y][x]))似乎是關鍵。

非常感謝。

+0

什麼是你的結果是什麼樣子?我無法完全從你的描述中描繪出來。我懷疑你的問題的答案會使用字典。 – cco

+0

感謝您的回覆!我的結果看起來像元組:[[1,2,1,2,3,1] [5,7,3,2,9,8] etc]。對於每個唯一的ID,上面的代碼生成一個包含六個數字的列表 - 一個數字來自每個開始的csv文件(總數[0] [x])。 – PeptideWitch

回答

0

問題是,您正在通過搜索列表而不是使用字典(或集合)來查找名稱。基本計劃通常與您擁有的相同(獲取所有名稱,然後掃描每個文件的數據以獲取附加值)。

如果我理解你正確地,這裏是做這件事:

total = [ [ ["Name", 6, 4.3],["Name2", 7, 5.5] ], [ ["Name3", 12, 5.7], ["Name4", 8, 9.2] ] ] 
datasets = [ dict((row[0], row[1:]) for row in dataset) for dataset in total ] 
for data in datasets: 
    unique_names.update(data) 

def CollectProteinInformation(datasets, unique_names): 
    spectralcount = {} 
    for name in unique_names: 
     spectralcount[name] = [ data.get(name, [0.1])[0] for data in datasets ] 

    return spectralcount 
+0

輝煌的解決方案,謝謝。爲我提供我所需要的,並且執行得非常快。非常感謝你。 +1 – PeptideWitch

相關問題