Python - 创建任意数量的列表以存储列中的所有值

时间:2014-02-14 22:36:34

标签: python

我有csv文件,其中列数不是常量。对于每一列,我试图将该列中的所有值存储到一个单独的列表中,以便我可以计算重复值的数量。我已经编写了一些代码来执行此操作但是,它似乎不会append进入列表中。

示例输入为love hurt hit。 我的输入是一个csv文件,其中包含可变数量的行和可变数量的列。它不断更改为不同的csv文件。假设一个文件有3列,下一个文件有20列。是和否是所有这些列下的值。这些值的出现是随机的。我想要做的是提取每个列中的所有值,并将它们附加到列表中。因此,一旦我退出for循环,我理想地希望看到给定列中的所有值;不是最后一个值,也不是每个值都打印在另一个之下。

当我追加所有值时,['love', 'yes' 'no', 'yes' ......]应该是yes,其中nolove['love']列下的值。 相反,我将每个值打印在一个新行上,例如:

['yes']

a,b,c = [],[],[] headings = [] allCols = [] def getColCount(currLine): return len(currLine) # Open the file and read it with open(filename1, 'r') as f1: csvlines = csv.reader(f1, delimiter=',') for lineNum, line in enumerate(csvlines): colCount = getColCount(line) allCols = [[] for x in range(0, colCount)] a.append(line[0]) # this prints like I want it to - in series for i in range(0, colCount): allCols[i].append(line[i]) # this doesn't print ','.join(allCols[2])

...

这是我到目前为止所拥有的。请帮忙!

{{1}}

4 个答案:

答案 0 :(得分:2)

如果要交换行和列,zip很有用。一个简单的例子:

>>> data = [["a", "b", "c"], # header row
            [1, 2, 3], # data rows
            [4, 5, 6], 
            [7, 8, 9]]
>>> swap = list(zip(*data))
>>> print(swap)
[('a', 1, 4, 7), # first column
 ('b', 2, 5, 8), # second column
 ('c', 3, 6, 9)] # third column

请注意,按the docs

  

返回的列表的长度被截断为最短参数序列的长度。

答案 1 :(得分:0)

您需要做的是将行拆分为每个单词的数组,然后将其添加到列表中。假设您的文件是'data.csv'。

您可以做的是阅读文件:

finalData = []
fileHandler = open('data.csv', r)
#Read the lines from the file
for line in fileHandler.readlines():
    #Split the line by comma
    lineArr = line.split(',')
    for i in range(len(lineArr)):
        #Strip any whitespace from the lines
        lineArr[i] = lineArr[i].replace(" ", "")
    #Add the data to the final array
    finalData.append(lineArr)

这是一种非常简单的方法,可以满足您的需求。

答案 2 :(得分:0)

另一种方法是使用熊猫。它的read_csv功能应该直接将它拆分成列,然后总结起来应该是非常简单的(每列上的collections.Counter)。

答案 3 :(得分:0)

如何使用词典来跟踪所有内容。

import csv

columns_and_values = {}

with open('my_file') as f1:
        csvlines = csv.reader(f1)
        for line in csvlines:
                line_index_counter = 1
                for value in line:
                        column_value_combo = str(line_index_counter)+"|"+value
                        if column_value_combo in columns_and_values.keys():
                                columns_and_values[column_value_combo]+=1
                        else:
                                columns_and_values[column_value_combo]=1
                        line_index_counter += 1

from pprint import pprint

pprint(columns_and_values)