2017-04-19 15 views
2

我想讀一個CSV文件:如何將嵌套列表轉換爲包含python字符串的列表? (解決)

SigGenelist = [] 
Sig = csv.reader(open('Genelist.csv')) 
for row in Sig: 
    SigGenelist.append(row) 
print (SigGenelist) 

打印出來是這樣的:

[['x'], ['0610010K14Rik'], ['0610011F06Rik'], ['1110032F04Rik'], ['1110034G24Rik'], ... 

所以我有一個嵌套的名單,但我想有一個列表每個元素作爲字符串,是這樣的:

['x', '0610010K14Rik', '0610011F06Rik', '1110032F04Rik', '1110034G24Rik', ... 

我試圖元素轉換爲字符串一樣:

SigGenelist = [] 
Sig = csv.reader(open('Genelist.csv')) 
for row in Sig: 
    row = str(row) # try to change row into string instead of list 
    SigGenelist.append(row) 
print (SigGenelist) 

,但沒有得到什麼,我想......

["['x']", "['0610010K14Rik']", "['0610011F06Rik']", "['1110032F04Rik']","['1110034G24Rik']"... 

什麼建議嗎?

更新: 問題解決。 (請參閱下面的答案。)感謝以下有用的建議。我學到了很多東西。

+0

一定要標記答案爲「接受」! –

回答

2

而不是append嘗試使用+操作,改變你的線

... 
SigGenelist.append(row) 
... 

使用+=

... 
SigGenelist += row 
... 

Append用於單一的元素添加到列表中,而+ =和extend用於將右側的列表複製到左側。而且由於額外的函數調用使擴展更加昂貴(不是那麼重要,差別非常小),+ =是一種很好的方式。

1

試試這個:

my_list = [[1], [2], [3], [4], [5], [6]] 
print [item for sublist in my_list for item in sublist] 

這是一個列表理解,將壓平列表的列表到一個列表。

或者,也許更簡單的選項不附加,但將行添加到列表中。

SigGenelist = [] 
Sig = csv.reader(open('Genelist.csv')) 
for row in Sig: 
    SigGenelist += row 
print (SigGenelist) 

.append會將整個列表添加到列表的末尾,從而產生嵌套列表。 +=將只是連接列表,使其成爲深度1的列表!

+1

對不起,我沒有意識到我可以「接受答案」,似乎我只能接受答案。但我給了你一個答案。感謝您的回答和解釋。 – Jun

+0

沒問題!你應該永遠接受那個最好的回答,並且umotto非常簡潔! –

1

更改此:

SigGenelist.append(row)

要這樣:

SigGenelist.extend(row)

0

使用sum內置函數,因爲csv.reader返回一個生成器,下面的代碼將做的工作:

Sig = csv.reader(open('Genelist.csv')) 
SigGenelist = sum(Sig, []) 
+0

基本上,它像其他方法一樣工作,但不知何故,第一個元素不會在新列表中...'['x','0610010K14Rik','0610011F06Rik','1110032F04Rik','1110034G24Rik',...] '我只得到'['0610010K14Rik','0610011F06Rik','1110032F04Rik','1110034G24Rik',...]',不知道我沒搞砸東西......雖然 – Jun

+0

'sum(generator,[] )'是我經常使用的代碼snipet。我確定中間有一些代碼會產生一些噪音。 – eguaio

+1

所有解決方案看起來都相同,但您應該使用速度更快,內存更少的解決方案。此外,你還應該尋找可讀性。比較'for'循環,並將循環外的列表初始化爲「單行」,哪一個更容易閱讀?哪一個有更少的機會讓你引入一個bug?在這種情況下,我更願意只用一行完成工作。而從其他所有入門者,我認爲我建議的選項是最清晰易讀的,並且不需要任何其他庫導入。我不會發布另一個答案如果我認爲其他人是平等的。 – eguaio

1

這可能是慣用的:

from itertools import chain 
csv_reader = csv.reader(open('Genelist.csv')) 
SigGeneList = list(chain.from_iterable(csv_reader)) 
+0

不確定我搞砸了什麼,但它沒有爲我工作...... – Jun

相關問題