【问题标题】:Taking each column as its own list将每一列作为自己的列表
【发布时间】:2015-03-25 12:17:23
【问题描述】:

使用 csv 的目标是为 csv 中的每一列创建一个列表,忽略第一行,即标题行。

 var_a        var_b
   a            1
   b            2
   c            3

listA = [var_a] = ['a','b','c']
listB = [var_b] = [1,2,3]

现在,我唯一的解决方案是创建一个空列表并逐个位置迭代 csv 并将其附加到这些空列表中。

【问题讨论】:

标签: python list csv


【解决方案1】:

如果你有足够的记忆力,你可以优雅一点:

with open('the.csv') as f:
    next(f)
    list_of_rows = list(csv.reader(f))

listA = [row[0] for row in list_of_rows]
listB = [int(row[1]) for row in list_of_rows]

但这与你现在所说的并没有太大的不同——只是更优雅一点。

(在您的示例中,第二列以某种方式给出了ints 的列表,而第一列给出了strs 的列表——也没有什么黑魔法可以做到那个,所以我在需要的地方明确使用了int)。

【讨论】:

    【解决方案2】:

    您是否查看过 python 附带的 csv 工具?这些可以帮助您缩减代码。

    此外,就复杂性而言,迭代每个元素是您能做的最好的事情。如果更简单,您可以尝试将所有内容加载到矩阵中

    both = [[a, 1], [b, 2], [c, 3]]
    

    (这是 python 的 csv 工具自然会为你做的),以及转置

    z = list (zip (*both))
    listA = list (z[0]) # zip gives a tuple, make a list so you can edit
    listB = list (z[1])
    

    【讨论】:

      【解决方案3】:

      您可以使用字典阅读器并按标题创建列表:

      import csv
      
      result={}
      with open(fn) as f:
          for line in csv.DictReader(f, delimiter='\t'):
              for k in line:
                  result.setdefault(k, []).append(line[k].strip())
      
      print result
      

      打印:

      {'var_a': ['a', 'b', 'c'], 'var_b': ['1', '2', '3']}
      

      【讨论】:

        猜你喜欢
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多