我正在尝试转置数据,而zip功能完美无缺。除了它找到最长的列表并将其应用于我通过循环的每个列表之外,我最终会得到很多空白。
这是我的代码:
Read_Data = inputdata.readlines()
Length_Data = len(Read_Data)
for a in range(Length_Data):
split_data = Read_Data[a].split(',')
zipper = zip(split_data)
print zipper
这给了我这个输出(这只是一个来自更大数据集的一个示例列表):
[('Abagrotis alternata',), ('Bignoniaceae',), ('Cruciferae',), ('Ericaceae',), ('Fagaceae',), ('Juglandaceae',), ('Oleaceae',), ('Pinaceae',), ('Rosaceae',), ('Solanaceae',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('\n',)]
我有很多数据可以创建数千个这样的列表。有没有办法删除每个列表中出现的空格或''?谢谢你的帮助
我做错了所以这是我的示例数据
**Lep. Species** **Column** **Column** **Column**
Abablemma brimleyana Algae
Abagrotis alternata Bignoniaceae Cruciferae Ericaceae
Abagrotis anchocelioides Ericaceae Rosaceae
Abagrotis brunneipennis Rosaceae Ericaceae
Abagrotis cryptica Rosaceae Salicaceae
Abagrotis cupida Ericaceae Rosaceae Salicaceae
Abagrotis magnicupida Asteraceae Caryophyllaceae
这就是我希望我的输出看起来像
**Lep. Species** **Column**
Abablemma brimleyana Algae
Abagrotis alternata Bignoniaceae
Abagrotis alternata Cruciferae
Abagrotis alternata Ericaceae
Abagrotis anchocelioides Ericaceae
Abagrotis anchocelioides Rosaceae
等等。
我想我需要更多帮助。再次感谢您的帮助
答案 0 :(得分:6)
您可以在传递到zip
内置
zipper = zip(e for e in split_data if e)
<强>解释强>
e for e in split_data if e
没有括号,上面的表达式是generator expression。与list comprehension(带括号)不同的生成器表达式在传递给built-in
zip
之前不会生成整个列表。所以只有iterable zip
迭代,直到它引发异常StopIteration
Expression类似于以下循环表达式
result = []
for e in split_data:
#Empty Check
if e:
result.append(e)
答案 1 :(得分:3)
如果您尝试转置CSV文件的行和列,则会以错误的方式进行转换。
请改用:
import csv
by_column = zip(*csv.reader(inputdata))
by_column
现在是一个列表列表,每个嵌套列表都是inputdata
文件对象中的一列。
您只是一次压缩一行,而空字符串元组只是空列。
查看您的更新,您真正想做的就是切片行:
import csv
with open('somefilename.csv', 'rb') as inputfile:
reader = csv.reader(inputfile)
for row in reader:
row = row[:2]
# process `row` further. It now only contains the first 2 columns.
答案 2 :(得分:1)
您可以filter()
其中包含""
的元组。
>>> testList = [('Abagrotis alternata',), ('Bignoniaceae',), ('Cruciferae',), ('Ericaceae',), ('Fagaceae',), ('Juglandaceae',), ('Oleaceae',), ('Pinaceae',), ('Rosaceae',), ('Solanaceae',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('',), ('\n',)]
>>> filter(lambda x: not "" in x, testList)
[('Abagrotis alternata',), ('Bignoniaceae',), ('Cruciferae',), ('Ericaceae',), ('Fagaceae',), ('Juglandaceae',), ('Oleaceae',), ('Pinaceae',), ('Rosaceae',), ('Solanaceae',), ('\n',)]
列表可在Python中迭代。
您无需执行for i in range(len(...))
,只需将代码缩减为
Read_Data = inputdata.readlines()
for a in Read_Data:
#...
另外,readlines()
将整个文件读入内存,为什么不迭代文件呢?
for a in f:
#...
答案 3 :(得分:1)
我相信你误解了zip
函数的工作原理。它需要多个列表并返回元组列表。例如,
zipper = zip(["a", "b", "c"], [1, 2, 3])
print zipper
将输出
[(&#34; a&#34;,1),(&#34; b&#34;,2),(&#34; c&#34;,3)]
您使用的zip
只有一个列表。因此,结果是一个元组列表,每个元组只有一个元素。
我建议您不要使用zip
来解决原始问题,以转置数据的列和行。在尝试转置它们之前,您需要找出在第一个位置表示这些列和行的方法。
答案 4 :(得分:0)
您也可以这样写:
with open('data.txt') as inputdata: # open the file
for a in inputdata: # iterate through the lines of the file
split_data = a.strip().split(',') # strip the line (to remove `\n` and split it using ','
zipper = zip(element for element in split_data if element) # create the zip while keeping only non empty elements