删除Zip Function python创建的列表中的空格

时间:2013-07-25 16:05:11

标签: python transpose

我正在尝试转置数据,而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

等等。

我想我需要更多帮助。再次感谢您的帮助

5 个答案:

答案 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