我導入兩組六個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]))
似乎是關鍵。
非常感謝。
什麼是你的結果是什麼樣子?我無法完全從你的描述中描繪出來。我懷疑你的問題的答案會使用字典。 – cco
感謝您的回覆!我的結果看起來像元組:[[1,2,1,2,3,1] [5,7,3,2,9,8] etc]。對於每個唯一的ID,上面的代碼生成一個包含六個數字的列表 - 一個數字來自每個開始的csv文件(總數[0] [x])。 – PeptideWitch