计算CSV列表中每个位的排列的出现次数

时间:2014-02-24 20:36:41

标签: python

这里的新手,正在寻找一种用Python处理一些数据的简洁方法。

我有一个0和1的列表,长度在2到10位数的CSV文件中。我想计算该CSV中每个排列的出现次数。

这样做有简洁的方法吗?

这就是我所拥有的:

LL = float(0)
LW = float(0)
WL = float(0)
WW = float(0)    

with open('filename.csv', 'rb') as csvfile:
        my_content = csv.reader(csvfile)

        for row in my_content:
            if not row:
                continue
            else:
                if len(row) == 2:
                    if row == ['0', '0']:
                        LL += 1
                    if row == ['0', '1']:
                        LW += 1
                    if row == ['1', '1']:
                        WW += 1
                    if row == ['1', '0']:
                        WL += 1

等。对于每个长度的行......

这适用于2位,但我希望有另一种方法来执行更长的列表。谢谢你的帮助!

4 个答案:

答案 0 :(得分:3)

您可以使用collections.Counter。由于它是在字典上实现的,您需要将(可变list)行放入(不可变的)tuple中以使用它们:

from collections import Counter

count = Counter(map(tuple, my_content))

示例:

>>> data = [['0', '0'], ['0', '1', '0'], ['0', '0']]
>>> count = Counter(map(tuple, data))
>>> count
Counter({('0', '0'): 2, ('0', '1', '0'): 1})

这使您无需为要计算的每件事物定义单独的变量,也无法手动创建和增加字典,并且可以访问.most_common(n)等便利的额外功能。

答案 1 :(得分:2)

这应该会给你一个字典,将排列映射到他们的计数

import collections
import csv

answer = collections.defaultdict(int)
with open('filename.csv') as infile:
    for row in csv.reader(infile):
        answer[''.join(row)] += 1

如果您要在示例中运行此代码,您将拥有一个类似于以下内容的字典:

answer = {'00' : 1,
          '01' : 1,
          '10' : 1,
          '11' : 1,
         }

答案 2 :(得分:0)

首先,您可以只使用“LL = 0.0”而不是浮点数(0)。小数点表示它是浮点数。无论如何,你不需要浮点数,所以你可以使用整数。

接下来,您不需要my_content变量。只需“for csv.reader(csvfile)中的行”。

此外,使用单个字典而不是四个变量会更好。您可以使用类似“binCounts = {'00':0,'01':0,'10':0,'11':0}”而不是代码来自“if len(row)== 2: “等等,只需要这样的代码:

如果binCounts中有'.join(行):   binCounts [''。join(row)] + = 1

但是,您提到csv文件中的数字可以是2到10位数。这只会计算完全两位数的行。你能举例说明你的csv文件是什么样的吗?

答案 3 :(得分:0)

实际上,您正在尝试计算csv文件中显示的所有二进制数。最好的方法似乎是创建一个字典,其中包含实际数字和值的键。

假设你已经创建了一个函数parserow()[左边作为学生的练习(:-)],取1和0的行并返回该值的等价物。或者,如果(例如)'0001'被认为与'01'或'000001'不同,则可以返回实际连接的字符串

我假设你想要计算整个内容文件

countdict = {}
for row in my_content:
    outval = parserow(row)
    if outval not in countdict.keys():
      countdict[outval] = 0
    countdict[outval] += 1

然后,这应该会给你一个字典,其中包含已找到的所有可能性。您甚至可以在dicitionary中输入错误条目以显示有多少行具有非法值。