1

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

等等。

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

4

5 回答 5

6

您可以简单地忽略/过滤所有空行,然后再传递给zip内置

zipper = zip(e for e in split_data if e)

解释:

e for e in split_data if e

没有括号,上面的表达式是一个生成器表达式。生成器表达式与列表推导式(带括号)不同,在传递给built-in zip. 所以它只是一个迭代直到zip它引发异常StopIteration

该表达式等效于以下循环表达式

result = []
for e in split_data:
    #Empty Check
    if e:
        result.append(e)
于 2013-07-25T16:08:49.170 回答
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.
于 2013-07-25T16:29:25.933 回答
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:
    #...
于 2013-07-25T16:08:37.350 回答
1

我相信您误解了该zip功能的工作原理。它需要多个列表并返回一个元组列表。例如,

zipper = zip(["a", "b", "c"], [1, 2, 3])
print zipper

将输出

[("a", 1), ("b", 2), ("c", 3)]

您只使用zip一个列表。所以结果是一个元组列表,每个元组只有一个元素。

我建议你不要使用zip转置数据的列和行来解决你原来的问题。在尝试转置它们之前,您首先需要找出一种方法来表示这些列和行。

于 2013-07-25T16:30:12.107 回答
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
于 2013-07-25T16:21:07.570 回答