2017-04-19 14 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

相关问题