这里的新手正在寻找一种用Python处理一些数据的更整洁的方法。
我有0和1的列表,长度从CSV文件中的2-10位数不等。我想要计算每个置换在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位,但我希望有另一种方法来完成更长的列表。谢谢你的帮助!
发布于 2014-02-24 20:41:02
为此您可以使用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)。
发布于 2014-02-24 20:41:56
这将为您提供一本字典,将排列映射到它们的计数。
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,
}发布于 2014-02-24 20:48:39
首先,您可以使用"LL = 0.0“代替float(0)。小数点表示它是浮点数。无论如何,你不需要浮点数,所以你可以只使用整数。
接下来,您不需要my_content变量。只有"for row in csv.reader(csvfile)“。
另外,有一个字典而不是四个变量会更好。您可以使用"binCounts = {'00':0,'01':0,'10':0,'11':0}“这样的代码,而不是从"if len(行) == 2:”开始的代码,只需要这样的代码:
如果binCounts中的‘’.联接(行):binCounts‘.联接(行) += 1
但是,您提到csv文件中的数字可以是2到10位数。这将只计算的行,确切地说是两位数。你能举个例子说明你的csv文件是什么样子的吗?
https://stackoverflow.com/questions/21998462
复制相似问题